如何从多个十六进制计数位

时间:2017-11-27 10:31:47

标签: python binary hex

我有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)

2 个答案:

答案 0 :(得分:2)

这里有一些奇怪的事情:

  1. 当您计算设置位时,数字是表示为十进制还是十六进制无关紧要;
  2. 使用hex(..)将其转换为字符串;和
  3. 稍后你连接这些字符串,使得结果不是十六进制值。
  4. 我们可以在 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'))的原因。