十进制到二进制基于逻辑 B[i]*(2)^i 其中 i=[0,2,3..N-1]



我有一个函数,它接受一个二进制数组并根据以下逻辑返回一个小数:

1  |  -2  |  4  |  -8  |  16  |  -32 ...
1  |  0   |  0  |  1   |  1   |  1   = 1 + 0 + 0 + (-8) + 16 + (-32) = -23
def bin_to_dec(bin_array):
dec = 0
for i in range(0, len(bin_array)):
if i%2 == 0:
dec += bin_array[i] * 2**i
else:
dec += bin_array[i] * -2**i
print(dec)
return dec

我正在努力编写上述逻辑的小数到二进制部分。就像在函数中一样,该函数将例如 -23 作为输入,并返回 [1,0,0,1,1,1]。任何帮助将不胜感激。

您可以使用一些观察来解决此问题:

  1. 考虑一个系数为16的 5 位数字,1。数字的最大值是多少?21 = 1 + 4 + 16.同样,最小值将为6 = 16 - 2 - 8。所以,对于[6,21]之间的任何数,16系数保证为1
  2. 类似地,对于一个 6 位的数字,如果-32的位是1,则数字的范围将在[-42, 11]-32 - 2 - 8 = -42-32 + 16 + 4 + 1 = 11之间
  3. 现在,对于我们的问题,每个数字x可以用两种方式表示:
    a。(some binary number <= x)+(some positive value)(例如,20 = 16+4)
    b。(some binary number >= x)+(some negative value)(例如,7 = 16+(-9))
  4. 结合点 #3 和 #4,您可以确定数字的最高有效位。计算biggest binary number <= x的范围(通过二进制数,我的意思是2的指数)。如果x超出范围的上限,我们将使用方法3b将其表示为总和,否则方法3a.
    示例:对于20,最大指数 =16的范围[6,21],因此我们将使用3a。但是,对于30,我们必须使用3b并将其表示为64 + (some negative value)
  5. 同样,对于负数,您可以使用范围的下限来查看哪个将是最大的负指数。示例:对于-9,最大指数 =-8,其范围为[-10,-3]。由于-10<-9的下界,我们可以将其表示为-8 + (some negative value)。对于-14,我们必须将其表达为-32 + (some positive value)>

使用所有这些,您可以实现(递归或迭代,您的决定)。该算法大致如下所示:

convert(i):
x = rightmost bit/exponent for i
diff = difference between x and i
return x + convert(diff)

-23为例:

  1. Biggest exponenent <= -23 = -8.由于它超出了-8的范围,因此我们将其设为-32 + (9)。递归求解9.
  2. Biggest exponenent <= 9 = 4.由于它超出了4的范围,因此我们将其设为16 + (-7)。递归求解7.
  3. Biggest exponenent <= -7 = -2.由于它超出了-2的范围,因此我们将其设为-8 + (1)。递归求解1
  4. 对于1,我们得到1

所以我们得到(-32)+(16)+(-8)+(1),这是最初的求和。