【发布时间】:2013-11-06 05:09:15
【问题描述】:
这是一个小程序(14 行程序),它计算一个数字中设置的位数。
输入-输出--> 0-->0(0000000), 5-->2(0000101), 7-->3(0000111)
int CountBits (unsigned int x)
{
static unsigned int mask[] = { 0x55555555,
0x33333333,
0x0F0F0F0F,
0x00FF00FF,
0x0000FFFF
} ;
int i ;
int shift ; /* Number of positions to shift to right*/
for (i =0, shift =1; i < 5; i ++, shift *= 2)
x = (x & mask[i ])+ ( ( x >> shift) & mask[i]);
return x;
}
有人可以解释这里使用的算法/为什么会这样吗?
【问题讨论】:
-
你有什么不明白的?
-
程序的完整逻辑对我来说似乎很陌生。实际上,我是一名初学者 C 程序员,这就是为什么我很难理解这一点。拜托,你能告诉我程序的整个工作过程吗?谢谢。
-
如果您是初学者,请暂时忽略这一点。在你努力理解一些巧妙的小把戏之前,先专注于学习基础知识——这只会让你对重要的事情感到困惑和分心。
-
它看起来很像 FFT 变换的 DC 分量。
-
@SeanMcSomething - 我相信你的评论是善意的,但它并不是很有帮助。我们所有人都必须从某个地方开始。我们中的一些人选择从比其他人更困难的问题开始。 Bit twiddling 是 C 语言的强项之一,根据未来的兴趣,它可能是一个重要的学习领域。可以说,理解位旋转是 C 语言最基本的组成部分之一,因为它提供了对语言提供的原语的深入理解。