位运算及应用场景总结

位运算

符号描述运算规则
&两个位都是1,结果才是1;只要有一个为0,其值为0
|两个位都是0,结果才是0;只要有一个为1,其值为1
^异或两个位相同是0,相异为1
~取反0变1,1变0
<<左移各二进位全部左移若干位,高位丢弃,低位补0
>>右移各二进位全部右移若干位,高位补0或者符号位补齐

& 与运算

运算规则

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

总结

只有两位同时为1时,结果才为1,否则结果为0。

用途

  1. 清零: 如果想将一个单元清零,只要与一个各位都为零的数值相与,结果为零。
  2. 取一个数的指定位: 例如,取数 X = 1010 1110 的低4位,只需另找一个数 Y = 0000 1111,然后 X & Y = 0000 1110 即可得到 X 的指定位。
  3. 判断奇偶: 通过判断最未位是0还是1来决定奇偶,可以用 if ((a & 1) == 0) 代替 if (a % 2 == 0) 来判断 a 是否为偶数。

| 或运算

运算规则

0 & 0 = 0
0 & 1 = 1
1 & 0 = 1
1 & 1 = 1

总结

只要有一个为1,其值为1。

用途

  1. 设置某些位为1: 例如,将数 X = 1010 1110 的低4位设置为1,只需另找一个数 Y = 0000 1111,然后 X | Y = 1010 1111 即可得到。

^ 异或运算

运算规则

0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

总结

相应位相同为0,相异为1。

性质

  1. 交换律
  2. 结合律: (a ^ b) ^ c == a ^ (b ^ c)
  3. 对于任何数 x,都有 x ^ x = 0,x ^ 0 = x
  4. 自反性:a ^ b ^ b = a ^ 0 = a

用途

  1. 翻转指定位: 例如,将数 X = 1010 1110 的低4位翻转,只需另找一个数 Y = 0000 1111,然后 X ^ Y = 1010 0001 即可得到。
  2. 与0相异或值不变: 例如 1010 1110 ^ 0000 0000 = 1010 1110
  3. 交换两个数:
void Swap(int &a, int &b) {
if (a != b) {
    a ^= b;
    b ^= a;
    a ^= b;
}
}

~ 取反运算

运算规则

~1=1111 1110    ~1=-2
~0=1111 1111    ~0=-1

总结

将 0 变 1,1 变 0。

用途

  1. 使一个数的最低位为零: 例如,使 a 的最低位为0,可以表示为:a & 1。1 的值为 1111 1111 1111 1110,再按"与"运算,最低位一定为0。

左移运算符(<<)

定义:

将一个运算对象的各二进制位全部左移若干位,高位丢弃,低位补0。

例如,设 a = 1010 1110,a = a << 2 将 a 的二进制位左移2位、右补0,即得 a = 1011 1000。

若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。

右移运算符(>>)

定义:

将一个数的各二进制位全部右移若干位,高位补0或补符号位,右边丢弃。

例如,a = a >> 2 将 a 的二进制位右移2位,左补0 或补符号位,具体取决于数的正负。

操作数每右移一位,相当于该数除以2。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值