1. 位操作只能用于整形数据,对float和double类型进行位操作会被编译器报错。
2. 对于移位操作,在微软的VC6.0和VS2008编译器都是采取算术称位即算术移位操作,算术移位是相对于逻辑移位,它们在左移操作中都一样,低位补0即可,但在右移中逻辑移位的高位补0而算术移位的高位是补符号位。如下面代码会输出-4和3。
int a = -15, b = 15;
printf("%d %d\n", a >> 2, b >> 2);
因为15=0000 1111(二进制),右移二位,最高位由符号位填充将得到0000 0011即3。-15 = 1111 0001(二进制),右移二位,最高位由符号位填充将得到1111 1100即-4(见注1)。
3. 位操作符的运算优先级比较低,因为尽量使用括号来确保运算顺序,否则
一些运用
问题:怎样求二进制中“1”的个数(参照《编程之美》(5种解))
这道题很典型,利用位运算,二进制有关的题都能加快处理。(只选取了算法竞赛向的)
解一:不断求n%2
解二:判断二进制最后一位是不是“1”(时间复杂度o(long2 v),等于解一)
int Count(BYTE v)
{
int num=0;
while(v){
num+= v & 0x01;
v>>=1;
}return num;
}
解三:用 v&v-1 判断最高位是否为“1”
int Count(BYTE v)
{
int num=0;
while(v){
v&=v-1;
num++;
}return num;
}