c语言中的移位操作

1
2
3
int i = 0xcffffff3;
printf("ret1 = %xn", 0xcffffff3>>2);
printf("ret2 = %xn", i>>2);

这里得到的结果为:

1
2
ret1 = 33fffffc
ret2 = f3fffffc

cffffff3对应的二进制位: 1100 1111 1111 1111 1111 1111 1111 0011
用常量表示的右移位2:  0011 0011 1111 1111 1111 1111 1111 1100 =0x33fffffc
如果是变量表示则i位无符号数, 向右移位补位用1:
             1111 0011 1111 1111 1111 1111 1111 1100 = 0xf3fffffc
即有符号数不管右移几位前面都是补1。

汉明重量

从异或的真值表可以看出,不管是0还是1,和0做异或保持原值不变,和1做异或得到原值的相反值。