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

Unset All Bits Except Most Significant Bit C#

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

return UnsetAllBitsExceptMSB(400);

应该return256

给定 int 代表一个 32 位有符号整数,我猜第一位不应该被考虑在内。所以,这应该得到你想要的:

int result = 1 << 30;
while ((result & myInt) != result)
    result >>= 1;

我不确定 "quick and easy",但是您不需要为此进行任何按位运算...您的问题可以改写为“我怎样才能找到小于 2 的最大幂我的输入?这是一个简单的方法:

private int UnsetAllBitsExceptMSB(int x)
{
    int y = 1;
    while (y <= x)
    {
        y*=2;
    }
    return y / 2;
}

您好,这里有另一个可供考虑的选项:

public static int GetTopBitValue(int number)
{
    if (number < 0)
    {
        throw new ArgumentOutOfRangeException("Non negative numbers are expected");
    }

    int i = 1;
    while (i <= number)
        i = i << 1;

    return i >> 1;
}

编辑以涵盖边角案例。

没错,有窍门:

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;
}

这通过首先打开最高有效设置位右侧的所有位(00110000 变为 001111111)来实现。然后它使用 XOR 将结果右移一个来关闭除第一位以外的所有位。 (00111111 与 00011111 异或 = 00100000)

在某些情况下,还有其他方法可以更好地执行此操作,但无论输入如何,它都具有可预测的性能。 (5 个或,6 个右移,和一个异或)。