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

Python是一种广泛使用的编程语言,支持丰富的数据类型和运算符,其中包括二进制运算。二进制是一种二进制数系统,只包含两个数字0和1,它是计算机中常用的一种数据存储方式。对于二进制数字的加法运算,我们可以借助数学上的加法原理来实现。 二进制加法规则如下: 0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 1 + 1 = 10 从这个规则可以看出,当两个二进制位的值均为1时,它们相加时会产生一个进位,这就是我们需要考虑的主要问题。 下面是一个简单的Python二进制加法器的实现: ``` def binary_addition(a, b): # 将二进制数字符串转换为列表,并将前导零补齐 a = list(a.zfill(len(b))) b = list(b.zfill(len(a))) # 设置进位标志 carry = 0 # 存储结果的列表 result = [] # 从右到左遍历二进制串 for i in range(len(a) - 1, -1, -1): # 将当前两个二进制位和进位相加 s = int(a[i]) + int(b[i]) + carry # 如果和大于1,则需要产生进位 if s > 1: carry = 1 s %= 2 else: carry = 0 # 将当前位的结果存储到结果列表中 result.append(str(s)) # 如果最后还有进位,则在结果列表中添加一个'1' if carry == 1: result.append('1') # 将结果列表反转并转换为字符串 result.reverse() return ''.join(result) ``` 该函数接收两个二进制数字符串a和b作为输入,并返回它们的和。在实现中,将两个二进制数字符串转换为列表,并将它们的长度补齐以保证它们的位数相同。然后,从右到左遍历二进制数字串,并逐位执行加法操作(包括进位)。最后,将结果列表反转并转换为字符串即可得到最终的二进制加法结果。 该函数的时间复杂度为O(n),其中n为两个二进制数字串的长度。在实际应用中,我们可以将该函数封装为一个类,以便于重复使用。此外,还可以添加多种错误处理机制和优化方案来提高代码的健壮性和性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值