一:位运算的由来
位运算起源于C语言的低级操作,所谓低级操作是因为位运算的操作对象是二进制位,是计算机唯一能识别的一种数制,故这种低级操作对计算机来说是非常简单直接,友好高效的。
二:位运算的定义
程序中所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中对应的二进制位进行(+、--、*、/)操作。
三:位运算符的分类
(一) 位逻辑运算符
1:位与(&)——两个数对应的二进制位都为1时,该位结果为1否则为0
2:位或(|)——两个数对应的二进制位只要有1,该位结果为1,否则为0
3:位异或(^)——两个数对应的二进制位相异(不一样)时,该位结果为1,否则为0
4: 取反(~)——对数据对应的每个二进制位取反,即1变成0,0变成1
下面用图表解释一下
A | B | A&B | A|B | A^B | ~A | ~B |
0 | 0 | 0 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 | 0 | 1 |
1 | 1 | 1 | 1 | 0 | 0 | 0 |
从以上运算可以看出:
位与运算时:A与B同为1时其运算结果才为1,其余情况结果均为0
位或运算时:A与B之中只要有一个为1,其运算结果就为1,其余情况结果为0
位异或运算时:A与B两数取值相反时其运算结果为1,其余情况结果为0
取反运算时:对A取反时,1变成0,0变成1 .同理对B取反也是1变成0,0变成1.
当然A与B代表的不仅仅是一个数0或1,而是代表一串0和1组成的二进制序列,这些二进制序列可代表int类型的十进制整数
(二) 位移运算符
1:左移位(<<)——高位溢出舍弃,低位补0-----------左移位一位,相当于乘以2
2:右移位 (>>)——低位溢出舍弃,高位补0----------右移位一位,相当于以除2
如下例:
十进制 ——对应—— 二进制
4 100
8 1000
高位溢出 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 4 | 左位移 | |
0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | |||
低位补0 | |||||||||||
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 8 | 左移位一位,相当于乘以2 | ||
0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 4 | 右移位 | ||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | |||
高位补0 | 低位溢出 | ||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 2 | 右移位一位,相当于除以2 |
下面用代码块演示一下:
>>> print(4<<1) #左移位一位相当于乘以2
8
>>> print(4>>1) #右移位一位相当于除以2
2
四:位运算符优先级
位运算优先级从高到低依次为:取反(~)、左移位(<<)、右移位(>>)、无符号右一(>>>)、位与(&)、位异或(^)、位或(|)
五:位运算的优缺点
优点:直接操控二进制时使用,节约内存,使程序运行更快
可靠性高。二进制中只使用0和1两个数字,传输和处理时不易出错。
运算规则简单。
缺点:用二进制表示信息时,位数太多,太繁琐。
难于记忆,可读性差。