MOH*_*MED 2 c c++ bit-manipulation
问题:如何开发算法将所有设置位(1)以32位整数移位到右侧
例
V= 0b01001000110010
Run Code Online (Sandbox Code Playgroud)
将V包含5位集,如果我们将其转移到我们得到正确的:
V = 0b011111
Run Code Online (Sandbox Code Playgroud)
我尝试过的:
v = v - ((v >> 1) & 0x55555555); // reuse input as temporary
v = (v & 0x33333333) + ((v >> 2) & 0x33333333); // temp
c = ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24; // count
Run Code Online (Sandbox Code Playgroud)
上面的代码返回32位整数的设置位数
并使用以下代码
c = (1<<c) - 1;
Run Code Online (Sandbox Code Playgroud)
我们将第c一个位设置为1.释
还有其他算法比上述解决方案更好吗?
是否有可能只使用位运算(&,|,^,~,>>,<<在提出的解决方案)?
bitset<32> const bv( V );
size_t const numSetBits = bv.count();
uint32_t const answer = ~( ~0U << numSetBits );
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2530 次 |
| 最近记录: |