移位
有符号数的移位运算要注意。移位运算可能会丢弃超出的位数。有符号数二进制数1111 1111,先左移2位再右移三位为1111 1111,反之先右移三位再左移二位就是1111 1100。因为要在高位补上符号位。
移位运算也是以下标0开始计数的。比如1<<j
实际位数有j+1位。
优先级
还有个注意点:^ & | 位运算优先级比比较大小包括判断等于的优先级低。
基础位运算
v&(v-1)
去除掉v最后一个1,其实理解还是好理解,因为v的最后一个1肯定要变成0,而这个0后面的全是1,那这样就刚好&之后01111和10000变成0。
v&(1<<i)
查询v的第i为是否为1,
v|=(1<<i)
将v的第i位置1。
v&=~(1<<i)
将v的第i位置0
异或
偶数异或上1,会变成偶数+1。
其实很好想。假设偶数是xxxxx0,除了0这个偶数,其他偶数必然最后是0,那么和00001异或,相同的还是0,不同的才是1,所以和前面0异或保留下来的仍然是xxxxx,而0和1异或就是1,最后的数是xxxxx1,显然是xxxxx0+1.