簡體   English   中英

如何有效地獲取由最低有效非零位表示的數字

[英]How to get the number represented by least-significant non-zero bit efficiently

例如,如果它是0xc0,則結果為0x40。由於0xc0等於二進制值11000000,所以結果應為01000000。

public static byte Puzzle(byte x) {
    byte result = 0;
    byte[] masks = new byte[]{1,2,4,8,16,32,64,128};
    foreach(var mask in masks)
    {
      if((x&mask)!=0)
      {
        return mask;
      }
    }
    return 0;
}

這是我目前的解決方案。 原來這個問題可以用3-4行解決...

public static byte Puzzle(byte x) {
    return (byte) (x & (~x ^ -x));
}    

如果x是bbbb1000,〜x是BBBB0111(B是!b)

-x確實是〜x + 1,(2的補碼),因此將BBBB0111加1就是BBBB1000

〜x ^ -x然后為00001111,其中x給出最低的1位。

哈羅德在評論中提供了一個更好的答案

public static byte Puzzle(byte x) {
    return (byte) (x & -x);
}    

Maby不是最好的解決方案,但是您可以准備一個數組字節[256],存儲每個數字的結果,然后使用它。

1行中的另一個解決方案:

return (byte)((~(x | (x << 1) | (x << 2) | (x << 3) | (x << 4) | (x << 5) | (x << 6) | (x << 7) | (x << 8)) + 1) >> 1);

幾乎不是一線解決方案,但至少它不使用位的硬編碼列表。

我會做一些簡單的移動。 基本上,將值向下移位直到最低位不為0,然后再按執行移位的數量向上移位1以重建最低有效值。 由於它是一個“ while”,因此它需要提前進行零位檢查,否則它將在零上進入無限循環。

public static Byte Puzzle(Byte x)
{
    if (x == 0)
        return 0;
    byte shifts = 0;
    while ((x & 1) == 0)
    {
        shifts++;
        x = (Byte)(x >> 1);
    }
    return (Byte)(1 << shifts);
}

暫無
暫無

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

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