关于移位操作:

<< 左移位操作:从右边开始用0补空位

右移位操作:对于无符号数从左边开始补0;对于有符号数,或者补符号位,或者补0,由编译器决定(gcc的编译器是补符号位)

常用二进制位操作

  1. 将expr的第n(n从0开始)位设置为1: expr |= (1<<n);
  2. 将expr的第n(n从0开始)位设置为0: expr &= (~(1<<n));
  3. 判断expr的第n(n从0开始)位是否为1:bool b = expr &(1<<n);
  4. 翻转expr的第n(n从0开始)位:expr ^= (1<<n);
  5. 将最右侧的1翻转成0:expr &= (expr-1) (可以用来判断二进制中1的个数,每次翻转一个1,知道数字变为0)
  6. 向右连续传播最右侧的1位:expr |= (expr-1) (该操作使00101000 变为 00101111)
  7. 检查无符号数expr是否是2的整数次幂:if((expr&(expr-1))==0)return true; 即说明expr的二进制中只有一个1
  8. 将右侧的连续1位串翻转成0位串,其他保持不变:expr = ((expr|(expr-1))+1)&expr
  9. 检查无符号整数expr是否等于2的两个整数次幂之差 if(((expr|(expr-1))+1)&expr == 0)return true; (只要说明:无符号数二进制中所有的1都在一起)

参考:位操作