Python的二进制位运算
- Python
- 2016-04-05
- 153热度
- 0评论
导航
在牛客网刷题,碰到一道“位运算”的题目。由于从没用 Python 做过位运算,一直以为没这个功能。网上查了一下,没想到,Python 不仅支持位运算,功能还挺强大。顺带复习一下位运算。以下为网络转载:
Python语言能够对整数进行逐位操作,它支持的运算符及含义如下所示:
- &:按位与
- |:按位或
- ^:按位异或
- ~:取反
- <<:左移
- >>:右移
对于整型数据,各种位操作是对该数据的补码进行的(正数的补码与原码相同,下面举例皆以正数为例);对于长整型数据,由于其位宽不定,所以进行位运算时,认为其补码的符号位向外无限扩展。下面对各运算符进行举例说明:
(1)首先看取反
>> ~1 -2 >>> ~0x0001 -2 >>>
正整数1,int型是32位的,就是00000000 00000000 00000000 00000001 求反变为11111111 11111111 11111111 11111110,这正好是-2的补码。同样十六进制的0x0001结果是一样的。
(2)按位与
>> 1&2 0 >>> 1&3 1 >>>
对于按位与,就是对参加运算的两个整数的补码逐位进行逻辑与运算,即参加运算的两个运算量,如果两个相应位都为1,则该位的结果为1,否则为0。
(3)按位或
>>> 1|1 1 >>> 1|2 3 >>>
对于按位或,就是对参加运算的两个数字的补码逐位进行逻辑或运算,即参加运算的两个运算量,只要两个相应位中有一个为1,那么该位的结果为1;只有两个相应位都为0时,该位的结果才为0。
(4)按位异或
>>> 1^1 0 >>> 1^2 3 >>>
对于按位异或,就是对参加运算的两个数字的补码逐位进行逻辑异或运算,即参加运算的两个运算量,如果两个相应位相同,那么该位的结果为0;如果两个相应位不同即相异,那么该位的结果为1。
(5)左移运算
>>> 1<<2 4 >>>
对于左移运算,就是将一个数的二进制位整体向左移若干位,移位后在低位补零,高位溢出部分舍弃。所以1<<2就是把整数1的二进制补码00000000 00000000 00000000 00000001整体左移2位,舍弃溢出的高位并在低位补零后得到结果00000000 00000000 00000000 00000100,正好是十进制数4。实际上,将一个数左移几位,就相当于将这个数乘以2的几次幂。
(6)右移运算
>>> 4>>2 1 >>>
对于右移运算,就是将一个数的二进制位整体向右移若干位,如果该数为正数,移位后的低位溢出部丢弃,高位补零;如果该数为负数,则移位后的低位溢出部丢弃,高位补1,以保持符号不变。所以4>>2就是把正整数4的二进制补码00000000 00000000 00000000 00000100整体右移2位,舍弃溢出的低位并在高位补零后得到结果00000000 00000000 00000000 00000001,正好是十进制数1。实际上,将一个数右移几位,就相当于将这个数除以2的几次幂。
在优先级方面,取反运算符~跟算术运算符中的单目运算符(即只有一个操作数参加运算)同级,并且是所有位运算符中优先级最高的;然后是移位运算符(左移<<和右移>>),它们比取反运算符和算术运算中的加减运算符低;最后是逐位与、或和异或运算符。各位运算符按照优先级有高到低排列如下所示:
取反运算符 > 左移运算符 > 右移运算符 > 按位与运算符 > 按位异或运算符 > 按位或运算符
在位运算符中,取反运算符(单目运算符)~的结合性是从右向左结合,其余双目运算符的结合性是从左向右结合。