python的整数取反_关于使用python ~取反操作符带出的一系列问题

晚上的时候,无意之间看到stackoverflow上面的一个编程挑战赛,各路高手各种搞事,看到python的地方突然发现用了很多位运算的符号,但是~符号引起了我和同事的注意。

我们很少在程序中使用这种东西,一个是可读性问题,二是感觉不是很熟练于是兴致来了,便探究一番~按位取反运算(注意这是一个运算符,跟反码不是一个东西)。

首先看看行为

In [1]: ~3Out[1]: -4

取反3等于-4,那么是如何进行计算的呢?

首先我们知道3的二进制用8bit表示为 0000 0011 那么对这个数进行二进制取反得到 1111 1100 这点来说应该不会有什么理解上的问题。

但是到这里,如果已经忘记或者不知道负数在计算机中是以补码形式表示的盆友(比如我这个菜🐔)就会疑惑了 1111 1100 并不是-4啊???怎么回事。

现在计算机普遍使用补码表示负数,所以现在问题变成了 一个数x的补码等于1111 1100 我们要求这个x。

知道一个数的补码 要求其值的方法是 首先看符号位也就是最左的一位,如果是1代表是负数(-)如果是0代码是正数(+),然后对该值取反+1得到其源码

1111 1100 取反 0000 0011 + 1 = 0000 0100 加上符号- 0000 0100 = -4

搞清楚了吗? 没有? 我们再看看个负数的反码

In [3]: ~-4Out[3]: 3

首先-4 的表示是使用了4的补码 也就是 0000 0100 的补码 1111 1100表示,在计算机存储中这个数表示-4。

然后我们取-4的反码 也就是取1111 1100的反码

1111 1100 取反 0000 0011 结果等于3

Reference:

《计算机科学导论》--Behrouz A.Forouzan

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值