一. 基本概念
& | 与 | 两个位都为1时,结果才为1 |
---|---|---|
| | 或 | 两个位都为0时,结果才为0 |
^ | 异或 | 两个位相同为0,相异为1 |
~ | 取反 | 0变1,1变0 |
<< | 左移 | 各二进位全部左移若干位,高位丢弃,低位补0 |
>> | 右移 | 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移) |
&=、|=、 ^=、<<=、>>= | 复合运算 | a &=b ==> a=a&b |
二. 介绍及用途
一. 与运算
1. 取一个数的指定位
取数 X=1010 1110 的低4位
1.找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,
2.将X与Y进行按位与运算(X&Y=0000 1110)
2. 清零
如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。
3. 判断奇偶
二进制的最后一位若为0, 在十进制中,最后一位为偶数, 同理, 最后一位为1, 为基数
if 101 % 2:
print('偶数')
else:
print('奇数')
--------------------------------------------
if 101 & 1:
print('奇数')
else:
print('偶数')
二. 或运算
1. 常用来对一个数据的某些位设置为1
将数 X=1010 1110 的低4位设置为1,
1.找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,
2. 然后将X与Y进行按位或运算(X|Y=1010 1111)
三. 异或运算
1. 翻转指定位
将数 X=1010 1110 的低4位进行翻转,
1. 找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,
2. 然后将X与Y进行异或运算(X^Y=1010 0001)
四. 左移运算符
定义:将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
设 a=1010 1110,a = a<< 2 将a的二进制位左移2位、右补0,即得a=1011 1000。
若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。
五. 右移运算
定义:将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
a=a>>2 将a的二进制位右移2位,左补0 或者 左补1得看被移数是正还是负。
操作数每右移一位,相当于该数除以2。
六. 复合运算
&= 例:a&=b 相当于 a=a&b
|= 例:a|=b 相当于 a=a|b
>>= 例:a>>=b 相当于 a=a>>b
<<= 例:a<<=b 相当于 a=a<<b
^= 例:a^=b 相当于 a=a^b
三. 练习
1.当变量X的第n位需清0,其它位不变,可使用:
X &= ~(1 << n);
注:
1 << n: 1向左移动n位,扩大2^n倍
X = X & (~(1 << n)),
2.当变量X的第n位需置1,其它位不变,可使用:
X |= (1 << n);
3.当需要检测Px的第n位是否为0时,可以使用 :
if((Px & (1 << n))==0),
else 输出
4.当需要检测Px的第n位是否为1时,可以使用 :
if((Px | (~(1 << n))) ==1),
else 输出