《程序员面试宝典》编程技巧--位运算
1. 判断一个整数是否是2的N次方:
x&x-1
如果X为2的N次方,例如二进制1000,结果就会为0。这个方法非常巧妙,还可以用来判断一个整数中,二进制表示中1的个数,如下:
int count = 0; 输入m; while(m) { count++; m=m&(m-1); }
每执行一次,会把m中最低位的1清零。所以最终count最终就得到m中1的个数。
2. 不用判断语句求a、b中的最大值:
int max = ((a + b) + abs(a-b)) / 2;
int tmp=a+b; char * strs[2] = {"a大",“b大”} tmp = unsigned(tmp) >> (sizeof(int)*8 - 1); cout <<strs[c]<<endl;
这里利用了负数,最高位符号为1的特性。如果b大于a,tmp就为负数,利用无符号数的右移位(高位补零),留下tmp最高位,即符号位。
3. 不使用中间变量交换a、b的值:
a = a + b; b = a - b; a = a - b;
a + b得到的结果可能会越界。下面的方法则不会存在这样的问题。
a = a ^ b;//异或 b = a ^ b; a = a ^ b;
4.计算机内部数的表示---二进制运算
int b = 0x80000000//为-2147483648
对于0:原码有两种表示方法;
[+0]=0x00000000;
[-0]=0x80000000;
对应的反码也有两种表示。
不过补码只有一种:
[+0]=[-0]=0x0000000;