烧脑的算数(交换2个变量值)

来源:互联网 发布:windows loader好用吗 编辑:程序博客网 时间:2024/05/17 02:34

Topic: 不使用第三个变量, 交换2个变量的值。


方法一: 使用加减法实现, 缺点很明显,即加法操作可能导致数字越界。 

int a=1;int b=2;a = b - a;  //间距差值b = b - a;  //原值减掉差值,就是共同部分的aa = a + b; //共同部分加上差异部分就是b

原理: 将2个值视为一条线上的2个点, 值都是相对于原点; 计算出2个点的间距以及共同部分。


方法二: 位运算, 原理是数字与任意数字连续异或2次仍然等于原值(类似于负负为正),说白了就是同一个数异或2次相当于啥都没变。优点:不会数字越界。

var a = 10var b = 20a = a^bb = a^b     //等同于 b = a^b ^b , 而 a^b ^b = aa = a^b     //等同于 a = a^b ^ a , 而 a^b^a = b

判断一个数字是2的整数次幂? 说人话就是2、4、8、16、32、64等等。 特点是只有第一个bit是1,其它bit都是0。

实现原理: 整数次幂减1后只有第一个bit是0, 其它bit都是1; 二者逻辑与肯定等于0.

//判断一个数是2的整数次幂//原理:在二进制中,乘以2相当于左移一位,所以2的整数次幂,相当于左移了n位,表示为100..00,而减一后,即为011..11,它们的与结果等于0.func isPowerOfTwo(_ value: Int) -> Bool {    return (value & (value-1)) == 0}

上面是Java语言的写法, 那么Swift语言如何实现呢? 当然也可以按照上面的2种算法实现, 但下面要介绍的是Swift独有的语法:

1、使用系统API swap函数



2、使用tuple元组方式, 这是Swift4的新特性。

var a = 1var b = 2(b, a) = (a, b)print("\(a)-\(b)")  //2-1

     元组还支持交换3个或更多的变量,这个特性很屌~~~

var a = 1var b = 2var c = 3(c, b, a) = (a, b, c)print(a,b,c)  //3 2 1



原创粉丝点击