经常看面试题发现有一个问题很多次出现,那就是如何交换两个变量的值,而且不借助中间变量,比较大众的方法就是加减乘除法。
a=a+b;
b=a-b;
a=a-b;
或者是
a=a*b;
b=a/b;
a=a/b;
两个方法都可以得到正确答案但是前者对于浮点数精度会有损失,后者得保证b不为0。
学习位运算后,用异或运算也能完成这项工作。
a=a^b;
b=a^b;
a=a^b;
解释一下异或就是指不同的值异或为1,相同的值异或为0;第二行b=(a^b)^b=a;而第三行a=(a^b)^a=b;这样就完成了两个值的转换。
顺便说一下二进制中的原码,反码,补码。我们知道一个字节占9位,而int有4个字节,所以是32位。
原码是指一个整数按照绝对值大小转换为的二进制,比如14就是00000000 00000000 00000000 00001110
反码则是将二进制数按位取反,得到的新的二进制数,那么14就是11111111 11111111 11111111 11110001
补码则是将反码加1得到的二进制数,那么14就是11111111 11111111 11111111 11110010
负数是以其正值的补码形式表示 ,那么-14就是11111111 11111111 11111111 11110010