Python的二进制位运算

本文详细介绍了Python中的位运算符及其工作原理,包括按位与、按位或、按位异或、取反、左移和右移等操作,并通过实例展示了这些运算符的具体应用。

Python语言能够对整数进行逐位操作,它支持的运算符及含义如下所示:

 

&:按位与

 |:按位或

 ^:按位异或

 ~:取反

 <<:左移

 >>:右移

对于整型数据,各种位操作是对该数据的补码进行的(正数的补码与原码相同,下面举例皆以正数为例);对于长整型数据,由于其位宽不定,所以进行位运算时,认为其补码的符号位向外无限扩展。下面对各运算符进行举例说明:

1)首先看取反

>>> ~1

-2

>>> ~0x0001

-2

>>> 

正整数1int型是32位的,就是00000000 00000000 00000000 00000001 求反变为11111111 11111111 11111111 11111110,这正好是-2的补码。同样十六进制的0x0001结果是一样的。

2)按位与

>>> 1&2

0

>>> 1&3

1

>>> 

对于按位与,就是对参加运算的两个整数的补码逐位进行逻辑与运算,即参加运算的两个运算量,如果两个相应位都为1,则该位的结果为1,否则为0

2)按位或

>>> 1|1

1

>>> 1|2

3

>>> 

对于按位或,就是对参加运算的两个数字的补码逐位进行逻辑或运算,即参加运算的两个运算量,只要两个相应位中有一个为1,那么该位的结果为1;只有两个相应位都为0时,该位的结果才为0

3)按位异或

>>> 1^1

0

>>> 1^2

3

>>> 

对于按位异或,就是对参加运算的两个数字的补码逐位进行逻辑异或运算,即参加运算的两个运算量,如果两个相应位相同,那么该位的结果为0;如果两个相应位不同即相异,那么该位的结果为1

4)左移运算

>>> 1<<2

4

>>> 

对于左移运算,就是将一个数的二进制位整体向左移若干位,移位后在低位补零,高位溢出部分舍弃。所以1<<2就是把整数1的二进制补码00000000 00000000 00000000 00000001整体左移2位,舍弃溢出的高位并在低位补零后得到结果00000000 00000000 00000000 00000100,正好是十进制数4。实际上,将一个数左移几位,就相当于将这个数乘以2的几次幂。

5)右移运算

>>> 4>>2

1

>>> 

对于右移运算,就是将一个数的二进制位整体向右移若干位,如果该数为正数,移位后的低位溢出部丢弃,高位补零;如果该数为负数,则移位后的低位溢出部丢弃,高位补1,以保持符号不变。所以4>>2就是把正整数4的二进制补码00000000 00000000 00000000 00000100整体右移2位,舍弃溢出的低位并在高位补零后得到结果00000000 00000000 00000000 00000001,正好是十进制数1。实际上,将一个数右移几位,就相当于将这个数除以2的几次幂。

 

在优先级方面,取反运算符~跟算术运算符中的单目运算符(即只有一个操作数参加运算)同级,并且是所有位运算符中优先级最高的;然后是移位运算符(左移<<和右移>>),它们比取反运算符和算术运算中的加减运算符低;最后是逐位与、或和异或运算符。各位运算符按照优先级有高到低排列如下所示:

 

取反运算符  左移运算符  右移运算符  按位与运算符  按位异或运算符  按位或运算符

在位运算符中,取反运算符(单目运算符)~的结合性是从右向左结合,其余双目运算符的结合性是从左向右结合。

### Python 中的二进制运算 #### 二进制值赋值给变量 在Python中,可以直接通过前缀`0b`将二进制数值赋予变量。例如: ```python binary_value = 0b1010 # 十进制中的10 print(binary_value) # 输出十进制形式 ``` 此代码片段展示了如何定义并打印一个二进制数[^1]。 #### 二进制到其他进制转换 对于从二进制向八进制或其他进制转变的需求,在Python里可以通过内置函数轻松完成。比如要将二进制字符串转化为八进制整型数据,则可先将其转成整型再调用oct()函数处理: ```python binary_str = "0b1011" decimal_num = int(binary_str, base=2) octal_representation = oct(decimal_num)[2:] # 移除'0o'前缀得到纯八进制表示 print(octal_representation) # 打印结果为 '13' ``` 上述例子说明了怎样把二进制串变换成对应的八进制表达方式[^2]. #### 实现二进制移位算法 利用Python提供的位运算符能够方便地执行左/右移操作。下面是一个简单的实例展示如何应用这些运算符来进行移位计算: ```python number_to_shift = 8 # 被移动的目标数字(即二进制下的1000) left_shifted_result = number_to_shift << 2 # 向左平移两位相当于乘以4 right_shifted_result = number_to_shift >> 1 # 向右平移一位等于除以2向下取整 print(f"Left shifted result is {bin(left_shifted_result)}") # 结果应为'0b100000'(十六进制下就是32) print(f"Right shifted result is {bin(right_shifted_result)}") # 应该显示'0b100'(也就是4) ``` 这里解释了使用位运算符<< 和>> 来改变指定数值的位置从而达到倍增或减半的效果[^3]. #### 使用按位逻辑运算符 除了基本的加减法之外,Python还支持多种类型的位级运算,包括但不限于AND(&), OR(|), NOT(~),XOR(^). 下面给出几个具体的应用场景及其预期输出: ```python a = 5 # 对应于二进制序列'0101' b = 9 # 表达为二进制则是'1001' and_operation = a & b # AND 操作会保留两个输入均为1的地方 or_operation = a | b # OR 则会在任一位置上存在1时返回1 xor_operation = a ^ b # XOR 返回那些仅在一个地方有差异之处设为1 not_a = ~a # NOT 是单目运算符用于翻转所有的比特位 print(bin(and_operation)) # 预期输出应该是'0b1',因为只有最低有效位相交. print(bin(or_operation)) # 显示'0b1011'. print(bin(xor_operation)) # 得到的是'0b1010'. print(bin(not_a)) # 展示'-0b101'.注意负号的存在是因为补码机制所致. ``` 以上部分介绍了几种常见的按位逻辑运算以及它们的作用效果[^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值