【发布时间】:2013-04-14 20:52:15
【问题描述】:
问题:如何开发算法将32位整数中的所有设置位(1)向右移动
例子
V= 0b01001000110010
V 包含 5 个设置位,如果我们将它们向右移动,我们会得到:
V = 0b011111
我尝试过的:
v = v - ((v >> 1) & 0x55555555); // reuse input as temporary
v = (v & 0x33333333) + ((v >> 2) & 0x33333333); // temp
c = ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24; // count
以上代码以 32 位整数形式返回设置的位数
并使用以下代码
c = (1<<c) - 1;
我们会将c 的第一位设置为1。 Explaination
还有比上述方案更好的算法吗?
是否可以在建议的解决方案中仅使用按位运算(&、|、^、~、>>、<<)?
【问题讨论】:
-
你用这个做什么?你想计算 1 位吗?
标签: c++ c bit-manipulation