我有一个函数,它接受一个二进制数组并根据以下逻辑返回一个小数:
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]。任何帮助将不胜感激。
您可以使用一些观察来解决此问题:
- 考虑一个系数为
16
的 5 位数字,1
。数字的最大值是多少?21 = 1 + 4 + 16
.同样,最小值将为6 = 16 - 2 - 8
。所以,对于[6,21]
之间的任何数,16
系数保证为1
。 - 类似地,对于一个 6 位的数字,如果
-32
的位是1
,则数字的范围将在[-42, 11]
-32 - 2 - 8 = -42
和-32 + 16 + 4 + 1 = 11
之间 - 现在,对于我们的问题,每个数字
x
可以用两种方式表示:
a。(some binary number <= x)
+(some positive value)
(例如,20 = 16+4
)
b。(some binary number >= x)
+(some negative value)
(例如,7 = 16+(-9)
) - 结合点 #3 和 #4,您可以确定数字的最高有效位。计算
biggest binary number <= x
的范围(通过二进制数,我的意思是2
的指数)。如果x
超出范围的上限,我们将使用方法3b
将其表示为总和,否则方法3a
.
示例:对于20
,最大指数 =16
的范围[6,21]
,因此我们将使用3a
。但是,对于30
,我们必须使用3b
并将其表示为64 + (some negative value)
。 - 同样,对于负数,您可以使用范围的下限来查看哪个将是最大的负指数。示例:对于
-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
为例:
Biggest exponenent <= -23 = -8
.由于它超出了-8
的范围,因此我们将其设为-32 + (9)
。递归求解9
.Biggest exponenent <= 9 = 4
.由于它超出了4
的范围,因此我们将其设为16 + (-7)
。递归求解7
.Biggest exponenent <= -7 = -2
.由于它超出了-2
的范围,因此我们将其设为-8 + (1)
。递归求解1
。- 对于
1
,我们得到1
。
所以我们得到(-32)+(16)+(-8)+(1)
,这是最初的求和。