Python中位运算详解

✨前言:

在Python中,位运算用于直接操纵数值的二进制位。以下是Python中的几种位运算符,每个位运算符的功能及其使用实例:

✨按位与(AND) - &

当两个操作数的位都为1时,结果的相应位才是1,否则是0。
📌例如:

a = 60           # 60 = 0011 1100
b = 13           # 13 = 0000 1101
c = a & b        # 12 = 0000 1100
print(c)         

✨按位或(OR) - |

只要两个操作数中的一个位是1,结果的相应位就是1。
📌例如:

a = 60           # 60 = 0011 1100
b = 13           # 13 = 0000 1101
c = a | b        # 61 = 0011 1101
print(c)         

✨按位异或(XOR) - ^

当两个操作数中的位相异时,结果的相应位是1。
📌例如:

a = 60           # 60 = 0011 1100
b = 13           # 13 = 0000 1101
c = a ^ b        # 49 = 0011 0001
print(c)         

✨按位取反 - ~

计算机内部在做数学运算时(也就是计算机的0和1的运算),都是以补码为标准的,说白了计算机中就一种码那就是补码,而现实社会中的编码规则,例如原码、反码都是我们自定义的,为了和计算机中的补码形成转换关系。所以说在我们手工计算这类由计算机计算的01运算,要站在计算机的角度。因此首先就要将我们的原码反码全都先转为补码,再来计算.
正数的原、反、补码都是它本身;负数的原码最高位为1开头,反码是最高符号位不变,其余位在原码的基础上取反,补码是在反码的基础上+1即可得到.
在Python中按位取反是使用波浪符号 ~ 操作符来完成的。按位取反操作翻转二进制表示中的所有位:将0变为1,将1变为0。

由于Python使用的是补码来表示整数,了解按位取反操作时需要记住以下几点:

对于非负整数,位取反操作的结果是:~x == -(x + 1)
对于负整数,位取反操作的结果是:~x == -(x + 1),其中 x 是负数的原码。
📌例如:

a = 10                    # 10的二进制表示: 0000 1010
complement_a = ~a         # 按位取反后的值: 1111 0101 (这里的表示是补码)

print(complement_a)       # 输出: -11

在进行按位取反操作时,结果不是简单地翻转了二进制中的位;事实上,结果是得到了操作数的补码形式。在这个例子中,10的二进制表示是0000 1010(考虑到8位整数,没有考虑符号位),当我们对10进行按位取反时,我们得到一个新的二进制表示1111 0101,这个新的二进制数是-11的补码表示。
为了解释这个结果,这里的关键是理解Python中整数是以补码形式存储的,因此按位取反后得到的实际上是补码表示的反码(即所有位取反),再加上1得到的补码。而由于整数位数不固定,所以实际上是按当前整数所占位数的配额进行取反(不仅仅是8位或32位)。结果是得到与原来的整数相反的数,并且比原来的数小1。
简单来说按位取反符号为~ ,它对于任何数字x的效果可以表示为-x - 1。

✨左移 - <<

把一个数的所有位向左移动指定的位数,右边空出的位用0填充。

📌例如:

a = 60           # 60 = 0011 1100
c = a << 2       # 240 = 1111 0000
print(c)         

✨右移 - >>

把一个数的所有位向右移动指定的位数,对于无符号数,左边空出的位用0填充,对于有符号数,根据具体实现可能用符号位填充。

📌例如:

a = 60           # 60 = 0011 1100
c = a >> 2       # 15 = 0000 1111
print(c)         

注意:以上给出的二进制形式是为了方便理解,Python会将它存储为数值的补码形式。对于位取反操作,你可能注意到结果不如你预期,因为Python中的整数是以补码形式存储的,并且Python中的整数位数是不固定的(不像C和C++中的32或64位整数),所以按位取反会影响所有的位,包括符号位。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天Aileft

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值