我正在生成一个使用梯形积分方法的FPGA程序的输入。基本上,这里关注的功能是Sub RunoutDateLoop()
Dim r As Long, c As Long
Dim Found As Boolean
r = 8
Do Until IsEmpty(Cells(r, 1))
c = 24
Do Until IsEmpty(Cells(r, c))
If Cells(r, c).Value < 1 Then
Cells(r, 18).Value = Cells(7, c)
Found = True
Exit Do 'Exit the inner do
Else
Cells(r, 18).Value = Cells(7, c)
End If
c = c + 1
Loop
r = r + 1
Loop
End Sub
和invert()
函数;其余的只是测试(创建方波信号,然后迭代并转换为二进制补码)。
twos_comp()
这里的问题是,它输出1的二进制补码为01111111,而不是1111111。signals = []
bit_signals = []
def invert(bit_val):
new_val = []
for i in bit_val:
new_val.append(str(int(not(int(i)))))
return ''.join(new_val)
def twos_comp(val):
if val < 0:
bin_val = format(val, '08b')[1:]
return format(int(invert(bin_val),2) + int('1', 2), '08b')
else:
bin_val = format(val, '08b')[1:]
return bin_val
x = 0
signal = 1
while x <= 25:
if x % 2 == 0:
signal*=-1
signals.append(signal)
x+=1
print(signals)
for i in signals:
bit_signals.append(twos_comp(i))
print(bit_signals)
的输出似乎是正确的,正数的invert()
的输出似乎是正确的,而且信号的产生似乎也是正确的,所以我认为这一定与线路有关
twos_comp()
但是在SO和google上四处看看,这就是其他人处理二进制文件添加的方式。
请注意,return format(int(invert(bin_val),2) + int('1', 2), '08b')
的所有输入均为8位。任何帮助将不胜感激,为什么这是行不通的。没有彻底的错误,只有错误的输出。
您可以运行代码here。
答案 0 :(得分:3)
在val
为-1
时逐步查找值:
>>> format(-1, '08b')
'-0000001'
您可能已经发现了错误-08b
表示8个字符宽,而不是8位数字。对于负数,-
占用1个字符,因此您只能得到8位数字。但是如果不清楚为什么会出现问题,让我们继续:
>>> format(val, '08b')[1:]
'0000001'
>>> invert('0000001')
'1111110'
>>> int(invert('0000001'), 2)
126
>>> int('1', 2) # BTW, why do you need this instead of just 1, exactly?
1
>>> 126 + 1
127
>>> format(127, '08b')
01111111
如果您想要一个可靠的解决方案(并且我怀疑您这样做,因为您已经在整个地方在字符串和数字之间来回移动了),只需执行以下操作:
bin_val = format(val, '09b')[-8:]
这对正数和负数都适用。