计算位数随机的输入值的汉明重量(Hamming weight)算法的python实现
汉明重量 Hamming Weight
汉明重量 Hamming Weight 是一串符号中非零符号的个数。对于一个2进制表示为n bits的输入input,其非0位的个数为w,则w即为input的汉明重量。
举例,input=10011010,其汉明重量w=4
概述
这篇博客是要是,使用python实现了n位输入input(n为一个范围内的随机值)的汉明重量,以及计算过程中需要使用的辅助常量的自动化计算。
主要适用场景如,机器学习中,需要计算一个8000-10000位的二进制向量中非0位的个数时,可以使用本算法计算辅助操作数并计算汉明重量
高效算法简介
汉明重量的计算算法的描述参见维基百科-汉明重量
其例图如下
python实现
相关介绍见代码中的注释
import random
# 对于要计算的总位数n的上限取log2(向上取整),当计算64位无符号整数时其值为8
# 例:最多10000位的输入其logBitsCount = log2(10000)≈14
logBitsCount = 8
def createInputTest():
# 创建一个随机的输入,用于测试,可以根据需要自定义
randomLength = random.randint(2 ** (logBitsCount - 1), 2 ** logBitsCount)
input = 1
countOfOne = 1
for i in range(0,randomLength-1):
temp = random.randint(0,1)
input = (input<<1) + temp
countOfOne += temp
print("input:", bin(input), ",位数:", randomLength, ",1的个数:", countOfOne)
return input
def createAidNums():
# 创建所需要使用的辅助操作数,如果logBitsCount固定,可以直接使用创建的结果,不需要重复创建
# 需要logBitsCounts个辅助的操作数,初始化其数组
aidNums = []
for a in range(0, logBitsCount):aidNums.append(0)
for i in range(0, 2 ** logBitsCount):
aidNums[0]= (aidNums[0]<<1) + i%2
for index in range(1, logBitsCount):
temp = 2**(index+1)
if i%temp==0:
aidNums[index] = (aidNums[index]<<(2**(index+1)))+2**(temp>>1)-1
return aidNums
def hammingWeight(input, aidNums):
# 使用aidNums中的辅助操作数,计算input的二进制表示中1的个数(也就是汉明重量)
result = input
# print(bin(last))
for i in range(0, logBitsCount):
temp1 = result & aidNums[i]
temp2 = (result>>(2**i)) & aidNums[i]
result = temp1+temp2
return result
def main():
input = createInputTest()
aidNums = createAidNums()
hw = hammingWeight(input, aidNums)
print(hw)
if __name__ == '__main__':
main()