该站点提供了一个应该在C#中工作的实现,只需进行一些修改:
public static uint highestOneBit(uint i)
{
i |= (i >> 1);
i |= (i >> 2);
i |= (i >> 4);
i |= (i >> 8);
i |= (i >> 16);
return i - (i >> 1);
}
Run Code Online (Sandbox Code Playgroud)
它基本上用1s填充低于最高位的所有位,然后除去最高位之外的所有位置.
示例(仅使用16位而不是32位):
start: i = 0010000000000000
i |= (i >> 1) 0010000000000000 | 0001000000000000 -> 0011000000000000
i |= (i >> 2) 0011000000000000 | 0000110000000000 -> 0011110000000000
i |= (i >> 4) 0011110000000000 | 0000001111000000 -> 0011111111000000
i |= (i >> 8) 0011111111000000 | 0000000000111111 -> 0011111111111111
i - (i >> 1) 0011111111111111 - 0001111111111111 -> 0010000000000000
Run Code Online (Sandbox Code Playgroud)