位运算

位运算符 含义
&
|
~
^ 异或
<< 左移
>> 右移

按位运算

按位与 &

01011010 & 11110101 = 01010000

常用应用:

  • 让某一位或者某些位为0

    • 11111110 & xxxxxxxx , 让前七位原封不动,最后一位无论是1还是0都变成0
  • 取一个数中的一段

    • 00011000 & xxxxxxxx, 只要中间两个数,其余数变成0

按位或 |

01011010 & 01010101 = 01011111

常用应用:

  • 让某一位或者某些位为0
    • 00000001 | xxxxxxxx , 让前七位原封不动,最后一位无论是1还是0都变成1
  • 将两个数拼起来
    • 如: 11000011 | 00111100 = 11111111

按位取反 ~

~ 00001111 = 11110000

按位异或 ^

10101100 ^ 01011100 = 00001111

  • 如果两个相等的数进行异或运算,结果为0

  • 对于同一值异或两次,原数值不变

按位异或有一个应用,可以不创建第三个变量来交换两个变量的值:

int a = 1;
int b = 2;
// a => 1; b => 2;
a = a^b;
b = a^b;
a = a^b;
// a -> 2; b => 1;

位移运算

左移 <<

  • i << j
    • i中所有的位向左移动j位,右边填0
    • 所有小于int的类型,位移以int的方式来做
  • x <<= 1 <==> x *= 2
  • x <<= n <==> x *= pow(2,n)
  • 上面这两点可以用二进制的按权展开来理解

右移 >>

  • i >> j
    • i中所有的位向右移动j位
    • 所有小于int的类型,位移以int的方式来做
    • 对于unsigned类型,左边填0
    • 对于sign类型,由于最左边的那一位是符号位,因此符号位不变
  • x >>= 1 <==> x *= 1/2
  • x >>= n <==> x *= 1/pow(2,n)
  • 上面这两点可以用二进制的按权展开来理解
最后修改:2023 年 04 月 28 日
如果觉得我的文章对你有用,请随意赞赏