如何将所有设置位向右移动?

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.

还有其他算法比上述解决方案更好吗?

是否有可能只使用位运算(&,|,^,~,>>,<<在提出的解决方案)?

Aru*_*run 7

bitset<32> const bv( V );
size_t const numSetBits = bv.count();
uint32_t const answer = ~( ~0U << numSetBits );
Run Code Online (Sandbox Code Playgroud)