二进制与位运算

位运算

Posted by Marlin on May 1, 2025

本文只记录了位运算部分。

进制

0x指的是十六进制的前缀
0b指的是二进制的前缀
0指的是八进制的前缀
example: 0x12 == 0b00010010 == 022 == 18

位运算

位运算符:

  • & 按位与运算符,两个位都为1时,结果才为1,否则为0.
    exp: 0b1010 & 0b1100 == 0b1000
  • | 按位或运算符,两个位中只要有一个为1时,结果就为1,否则为0.
    exp: 0b1010 | 0b1100 == 0b1110
  • ^ 按位异或运算符,两个位不同时为1时,结果为1,否则为0.
    exp: 0b1010 ^ 0b1100 == 0b0110
  • ~ 按位取反运算符,0变1,1变0.
    exp: ~0b1010 == 0b0101
  • << 左移运算符,二进制位向左移动指定位数.
    exp: 0b1010 << 2 == 0b101000
  • >> 右移运算符,二进制位向右移动指定位数.
    exp: 0b1010 >> 2 == 0b0010
  • &= 按位与赋值运算符,将运算结果赋值给左边的变量.
    exp: a = 0b1010; a &= 0b1100; a == 0b1000
  • |= 按位或赋值运算符,将运算结果赋值给左边的变量.
    exp: a = 0b1010; a |= 0b1100; a == 0b1110
  • ^= 按位异或赋值运算符,将运算结果赋值给左边的变量.
    exp: a = 0b1010; a ^= 0b1100; a == 0b0110
  • <<= 左移赋值运算符,将运算结果赋值给左边的变量.
    exp: a = 0b1010; a <<= 2; a == 0b101000
  • >>= 右移赋值运算符,将运算结果赋值给左边的变量.
    exp: a = 0b1010; a >>= 2; a == 0b0010

位运算与逻辑运算的区别

位运算符是对二进制位进行操作,而逻辑运算符是对逻辑值进行操作。
在运算a & b时, a和b都要进行计算,无论a是否为假,都要计算b,然后进行与运算。
在运算a && b时, 只要a为假,则不计算b,直接返回假。
其它运算符与&&&类似。