按位与
a & b
只有两个数所在的位都是1,才等于1,否则为0;
用处:
- 改变一个数某一个位为0,其他位不变;(如a & 0xFE,最后一位变为0,其他位不变)
a = 1010 0111
a & 1111 1110 = 1010 0110
- 取一个数的某一段;(如b & 0xFF,可以得到b最后8位的值)
b = 1111 ... 1111 1010 1010
b & 1111 1111 = 0000 ... 0000 1010 1010
按位或
a | b
两个数有一个数所在的位上是1,则为1,否则为0;
用处:
- 使得某一个位上或几个位上的数为1,其他位不变;(如a | 0x01,使a最后一位上的数为1,其他位不变)
a = 0101 0100
a | 0000 0001 = 0101 0101
- 使两个数拼接起来;(如0x00FF | 0xFF00 = 0xFFFF)
按位取反
~a
使这个数上的每一位1变成0,0变成1;
用处:
- 得到全部为1的数;(~0)
- 使连续某几位变为0/1;(如7是0x0111,a | (7)使得a的后三位变为1,a & (-7)使得a的后三位变为0)
按位异或
a ^ b
两个数,如果相同位上的数相等,结果为0,不相等结果为1;
用处:
- 如果两个数相等,那么a ^ b = 0;
- 用一个变量对同一个值异或两次,等于没做,又变回原来的数;(a ^ b ^ b = a)
移位
-
左移(i<<j)
i中所有的位数向左移j位,右边缺位补0;
所有小于int的类型,移位以int的方式来做,结果是int;
x <<= 1,相当于x *= 2;
x <<= n,相当于x *= 2^n; -
右移(i>>j)
i中所有位向右移j位,当数据i为unsigned类型时,左边缺位补0,当数据i为signed类型时,左边填入原来的做高位(保持符号不变);
所有小于int的类型,移位以int的方式来做,结果是int;
x >>= 1,相当于x /= 2;
x >>= n,相当于x /= 2^n;
#示例代码
int a = 0x80000000;
unsigned int b = 0x80000000;
printf("a<<1 = %x\n", a<<1);
printf("a>>1 = %x\n", a>>1);
printf("b<<1 = %x\n", b<<1);
printf("b>>1 = %x\n", b>>1);
#结果
a<<1 = 0
a>>1 = c0000000
b<<1 = 0
b>>1 = 40000000
----参考翁凯老师视频