取消设置除最高有效位之外的所有位 C#

rpe*_*trk 1 c# bit-shift bit unset

是否有一种快速简便的方法可以取消设置数字中除最高有效位之外的所有位?换句话说,我想获取一个整数 x 并对它应用 & 运算符,其中操作数按 x 中的总位数左移 1。例子:

return UnsetAllBitsExceptMSB(400);

应该返回 256

Rob*_*Kee 5

是的,有一个技巧:

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)。