作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
问题:如何开发算法将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
是否有其他算法比上述解决方案更好?
是否可以在建议的解决方案中仅使用按位运算(&
、|
、^
、~
、>>
、<<
)?
最佳答案
bitset<32> const bv( V );
size_t const numSetBits = bv.count();
uint32_t const answer = ~( ~0U << numSetBits );
关于c++ - 如何将所有设置位向右移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16004208/
我是一名优秀的程序员,十分优秀!