前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >硬件设计之 Distributed Arithmetic 一例

硬件设计之 Distributed Arithmetic 一例

作者头像
icsoc
发布2020-07-28 15:19:52
5930
发布2020-07-28 15:19:52
举报
文章被收录于专栏:ICSOC.TECHICSOC.TECH

下面是一段常见的c代码,用于计算下面这个问题。

问题:求一个32位整数的二进制表示中 1 的数量。

代码语言:javascript
复制
unsigned long CountOnes(unsigned long X) {
    X = (X & 0x55555555) + (X >> 1 & 0x55555555);
    X = (X & 0x33333333) + (X >> 2 & 0x33333333);
    X = (X & 0x0F0F0F0F) + (X >> 4 & 0x0F0F0F0F);
    X = (X & 0x00FF00FF) + (X >> 8 & 0x00FF00FF);
    X = (X & 0x0000FFFF) + (X >> 16 & 0x0000FFFF);
    return(X);
}

它背后的原理是什么呢?这篇文章尝试从硬件设计领域中 Distributed Arithmetic(DA算法)的角度来解释。

首先把这个问题转换成不那么专业的数学语言。

已知一个 32 位正整数

X=\sum_{b=0}^{N-1}x_b\cdot2^b

,其中

x_b

表示 X 的第 b 位,取值 0 或者 1。该位的权值即 2 的 b 次幂,

2^b

。N 在此例中等于 32。

求 X 的二进制表示中的 1 的数量,即

\sum_{b=0}^{N-1}x_b

上面 c 代码函数中的第一步

代码语言:javascript
复制
    X = (X & 0x55555555) + (X >> 1 & 0x55555555);

的结果可以用下式表示,

X=\sum_{b=0}^{n/2-1}(x_{2b}+x_{2b+1})\cdot2^{2b}

其中,b 的取值是 0 到 15。它的含义就是每相邻两个 bit 中含有的 1 的个数,这 16 个个数是单独体现在每两个 bit 组成的整数中,把这 16 个两 bit 数组合在一起,1 的个数的含义就模糊不清了,因为每个两 bit 数都用 2 的 2b 次幂加权了。分开看才会清楚,这也是这段 c 代码容易使人困惑的主要原因。

直接考虑用硬件实现的时候,不必用 1 个 32 bit 宽的加法器,而是用 16 个 1 bit 加法器并行计算。这就是 DA 算法的分布式计算特点。

上面 c 代码函数中的第二步

代码语言:javascript
复制
    X = (X & 0x33333333) + (X >> 2 & 0x33333333);

的结果可以用下式表示,

X=\sum_{b=0}^{n/4-1}(x_{4b}+x_{4b+1}+x_{4b+2}+x_{4b+3})\cdot2^{4b}

其中,b 的取值是 0 到 7。它的含义就是每四个 bit 中含有的 1 的个数,这 8 个个数是单独体现在每四个 bit 组成的整数中,同样这 8 个四 bit 数组合在一起,含义也是隐藏起来的,因为每个四 bit 数都用 2 的 4b 次幂加权了。同样也是分开看才清楚。

类似的第三步可以用下式表示,

X=\sum_{b=0}^{n/8-1}(x_{8b}+x_{8b+1}+x_{8b+2}+{...}+x_{8b+7})\cdot2^{8b}

其中,b 的取值是 0 到 3。

第四步可以用下式表示,

X=\sum_{b=0}^{n/16-1}(x_{16b}+x_{16b+1}+x_{16b+2}+ {...} +x_{16b+15})\cdot2^{16b}

其中,b 的取值是 0 到 1。

第五步,及最后一步可以表示为,

X=\sum_{b=0}^{n/32-1}(x_{32b}+x_{32b+1}+x_{32b+2}+ {...} +x_{32b+31})\cdot2^{32b}

其中,b 的取值只有 0,即上式可以简化为

X=x_0+x_1+x_2+{...}+x_{31}=\sum_{b=0}^{N-1}x_b

从这里就可以看到,此时 X 的取值,就是原来的 32 位整数 X 的二进制表示中的 1 的个数了。

看到这里,读者朋友们对这几句“奇技淫巧”般的代码背后的数学原理应该有所了解了吧。不过这种代码也并不只是在面试中为难面试者的,它还真是用来解决实际问题的。

比如,编码理论中经常提到的计算一个编码符号的 hamming weight,就是这个编码符号相对于全零编码符号的 hamming distance,二进制情况下也就是这个编码符号中 1 的个数。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 icsoc 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档