关于移位操作:
<< 左移位操作:从右边开始用0补空位
右移位操作:对于无符号数从左边开始补0;对于有符号数,或者补符号位,或者补0,由编译器决定(gcc的编译器是补符号位)
常用二进制位操作
- 将expr的第n(n从0开始)位设置为1: expr |= (1<<n);
- 将expr的第n(n从0开始)位设置为0: expr &= (~(1<<n));
- 判断expr的第n(n从0开始)位是否为1:bool b = expr &(1<<n);
- 翻转expr的第n(n从0开始)位:expr ^= (1<<n);
- 将最右侧的1翻转成0:expr &= (expr-1) (可以用来判断二进制中1的个数,每次翻转一个1,知道数字变为0)
- 向右连续传播最右侧的1位:expr |= (expr-1) (该操作使00101000 变为 00101111)
- 检查无符号数expr是否是2的整数次幂:if((expr&(expr-1))==0)return true; 即说明expr的二进制中只有一个1
- 将右侧的连续1位串翻转成0位串,其他保持不变:expr = ((expr|(expr-1))+1)&expr
- 检查无符号整数expr是否等于2的两个整数次幂之差 if(((expr|(expr-1))+1)&expr == 0)return true; (只要说明:无符号数二进制中所有的1都在一起)
参考:位操作