计算位数随机的输入值的汉明重量(Hamming weight)算法的python实现

计算位数随机的输入值的汉明重量(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()
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值