我有16个Hex值,我需要计算Bits的总数(1)
#I have tried this
val = hex(bus.read_port(0))+hex(bus.read_port(1)) #There are 16 ports.
#read port returns a Decimal (0-255)
#val is 0x3f0xff
def bitCount(val):
count = bin(val).count('1')
return (count)
#bitCount() Returns 6 instead of 14
但它只返回第一个字节的位。 在返回前打印val,例如0x3f0xff 我需要的是3F00FF(每个十六进制的二进制值一起串成一个十六进制) 或者另一种读取组合位数的方法。
这似乎有效,但我得到10而不是16
bus.write_port(0, 0xFF)
bus.write_port(1, 0xFF)
def popcount255(k):
k = (k & 15) + (k >> 4)
k = (k & 3) + (k >> 2)
return (k & 1) + (k >> 1)
def bitCount():
result = popcount255(bus.read_port(0)) + popcount255(bus.read_port(1))
return (result)
if True:
print "BitCount ", bitCount()
我得到10分?
现在正在使用
def bitCount():
result = bin(bus_1.read_port(0)).count('1') + bin(bus_1.read_port(1)).count('1')
return (result)
答案 0 :(得分:2)
这里有一些奇怪的事情:
hex(..)
将其转换为字符串;和我们可以在 O(log k)中为最多255(或常量 k 位)的值实现popcount
:
def popcount255(k):
k = (k & 85) + ((k & 170) >> 1)
k = (k & 51) + ((k & 204) >> 2)
return (k & 15) + ((k & 240) >> 4)
因此我们可以使用此函数来计算设置位:
result = popcount255(bus.read_port(0)) + popcount255(bus.read_port(1))
答案 1 :(得分:0)
您不需要转换为十六进制字符串来获取位数,只需将两个值直接转换为二进制字符串,计算每个值的1,然后添加两个结果:
bitCount = bin(bus.read_port(0)).count('1') + bin(bus.read_port(1)).count('1')
或者,如果您确实想要计算val = '0x3FFF'
以传递到原始bitCount()
函数,则可以执行以下操作:
val = hex((bus.read_port(0) << 8) + bus.read_port(1))
其中的工作原理如下:
--> hex((0x3F << 8) + 0xFF)
--> hex(0x3F00 + 0xFF)
--> hex(0x3FFF)
--> '0x3FFF'
你正在做的是连接两个十六进制字符串,因此你的问题是:
val = hex(bus.read_port(0)) + hex(bus.read_port(0))
--> hex(0x3F) + hex(0xFF)
--> '0x3F' + '0xFF' # string concatenation
--> '0x3F0xFF' # not '0x3FFF', extra '0x' in the middle
请注意,'0x3F0xFF'
不是十六进制数字的有效字符串表示形式(尝试使用bin()
将其转换为二进制文件时只看到意外{{1}之前的第一个'0x3F'
部分在中间,因此'0x'
返回count('1')
)的原因。