两个补码的Python(尽可能少的位)

两个补码的Python(尽可能少的位),python,python-3.x,binary,Python,Python 3.x,Binary,我试图输出负数的二进制表示,每次可用的字节数最少 例如: -3 -> 101 -10 -> 10110 下面是一种使用Python3整数的.bit_length方法实现这一点的方法。它还使用string.format方法进行整数到二进制字符串的转换。对于非负数,此函数返回一个以“0”开头的字符串,以便将其与负数区分开来 def twos_complement(n): m = n + 1 if n < 0 else n bitlen = 1 + m.bit_le

我试图输出负数的二进制表示,每次可用的字节数最少

例如:

-3 -> 101
-10 -> 10110

下面是一种使用Python3整数的.bit_length方法实现这一点的方法。它还使用string.format方法进行整数到二进制字符串的转换。对于非负数,此函数返回一个以“0”开头的字符串,以便将其与负数区分开来

def twos_complement(n):
    m = n + 1 if n < 0 else n
    bitlen = 1 + m.bit_length()
    mask = (1 << bitlen) - 1
    return '{0:0{1}b}'.format(n & mask, bitlen)

for i in (-10, -3, 0, 3, 10):
    print('{:3}: {}'.format(i, twos_complement(i)))

print('- ' * 30)

for i in range(-15, 16):
    print(i, twos_complement(i))    
工作原理 Python使用修改后的2的补码形式来表示整数。Python整数没有大小限制,因此负整数的行为就像它们有无限多个前导1位一样,如中所述

int.bit_length方法告诉我们表示一个数字所需的最小位数,我们需要多出一位,这样所有非负数都将以0开头,所有负数都以1开头。我们需要稍微修改一下,以确保-2**n形式的数字只得到一个前导一位,我们在计算位长度时,将所有负数加1


为了选择我们想要的位,我们需要一个适当长度的位掩码。如果位长度为4,我们需要1111=2**4-1的掩码;我们可以用求幂法来计算它,但是使用位移位更有效:1你能展示一下你说的尝试吗?你的问题是?为我写这段代码?给我一个这样的图书馆?这两个都是离题的,对不起。展示你的研究和你试图解决的任务。3 101怎么样?bin-3=='-0b11'如果输入为正,您希望输出什么?您希望5返回“0101”吗?我想是的,否则你就不能区分正数和负数了。@LutzHorn你能给我解释一下代码的逻辑吗?谢谢,它似乎可以工作-8正好是1000?∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑很抱歉耽搁了,但希望我写的东西有意义:
-10: 10110
 -3: 101
  0: 0
  3: 011
 10: 01010
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-15 10001
-14 10010
-13 10011
-12 10100
-11 10101
-10 10110
-9 10111
-8 1000
-7 1001
-6 1010
-5 1011
-4 100
-3 101
-2 10
-1 1
0 0
1 01
2 010
3 011
4 0100
5 0101
6 0110
7 0111
8 01000
9 01001
10 01010
11 01011
12 01100
13 01101
14 01110
15 01111
'{0:0{1}b}'.format(n & mask, bitlen)