《程序员面试宝典》编程技巧--位运算

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;

原文地址:https://www.cnblogs.com/XDJjy/p/3894967.html