python 二进制规则

反码,补码,还有0xffffffff到底是什么,今天仔细学!!!

一,反码

        例如 2,二进制为‘0b(30个0)10’。反码就是把其中0变成1,1变成0。

    那就是 要使用(异或),因为0^1 = 1, 1^1 = 0,那么2的反码 = 2 ^ (32个1)= '0b(30个1)01’

二,补码

         规则:对于正数,补码就是自己。对于负数a,补码=反码(-a) +1=(-a)^ (32个1)+ 1

三,0xffffffff

        其实0xffffffff = (32个1),那么简单了。

        对于a的反码 = a ^ 0xffffffff,

        对于a的补码 = a & 0xffffffff。

        对于大多数题目来说,负数都使用负数的补码表示,那么一开始就直接使用  a & 0xffffffff。

        看一下证明,补码=反码(-a) +1=(-a)^ (32个1)+ 1 = a & 0xffffffff。

>>> a = -2
>>> bin(a)
'-0b10'
>>> bin(a&0xffffffff)
'0b11111111111111111111111111111110'
>>> bin(-a^0xffffff + 1)
'0b1000000000000000000000010'

如果题目中给负数的补码c表示,我们怎么把它恢复成负数呢?

按照第二部分的规则,我们倒着来,负数 =- 反码(int(c,2)-1)

>>> c
'0b11111111111111111111111111111110'
>>> -((int(c,2)-1)^0xffffffff)
-2

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值