簡體   English   中英

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

[英]Unset All Bits Except Most Significant Bit C#

是否有一種快速簡便的方法來取消設置數字中除最高有效位以外的所有位? 換句話說,我想取一個整數x並將&運算符應用於該整數,其中操作數向1左移x的位數。 例:

return UnsetAllBitsExceptMSB(400);

應該返回256

是的,有一個竅門:

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的XOR = 00100000)

還有其他方法可以在某些情況下更好地執行此操作,但是無論輸入如何,這都具有可預測的性能。 (5個OR,6個右移和XOR)。

我不確定“快速而簡單”,但是您不需要為此進行任何按位運算...您的問題可以改寫為“我怎么能找到小於輸入的2的最大冪?這樣做的簡單方法:

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

給定int表示一個32位帶符號整數,我猜應該不考慮第一位。 因此,這應該得到您想要的:

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

您好,這里是您可以考慮的另一種選擇:

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

編輯以涵蓋極端情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM