是的,有一个技巧:
private int UnsetAllBitsExceptMSB(int x)
{
x |= x >> 16;
x |= x >> 8;
x |= x >> 4;
x |= x >> 2;
x |= x >> 1;
x ^= x >> 1;
return x;
}
Run Code Online (Sandbox Code Playgroud)
其工作原理是首先打开最高有效设置位右侧的所有位(00110000 变为 001111111)。然后,它使用 XOR 与结果右移一位来关闭除第一位之外的所有位。(00111111 与 00011111 = 00100000 进行异或)
还有其他方法可以在某些情况下执行此操作,但无论输入如何,其性能都可以预测。(5 个 OR、6 个右移和一个 XOR)。