常见的位运算

~ (取反)

取相反数,e = ~ a + 1

| (或);& (与);^ (异或)

1
2
3
4
5
int g = 0b0001010;
int h = 0b0001100;
cout << (g | h); //或运算,每一位只要有一位有1,就能够保留
cout << (g & h); //与运算,只有两位都是1,才可以保留
cout << (g ^ h); //异或,相同就是0,不同就是1

<< (左移)

1
2
3
4
5
//整体状态向左移动,用0补右边
int i = 0b0011010;
cout << (i << 1);
//000000'1101'0
//00000'1101'00

>> , >>>(右移)

1
2
3
4
5
6
//对非负数效果一样,向右移,并且用0来补充左边
//而对负数效果不一样
//'>>'用符号位来补;'>>>'一律用0来补位
//1111 0000 0000 (分别向右移动2位)
//1111 1100 0000
//0011 1100 0000

性质

对于非负数来说:

  • 非负数 << i ,等同于乘以2的i次方
  • 非负数 >> i ,等同于除以2的i次方