檢查數字是否為 2 的冪

如果整數 x 是 2 的冪,則只設定一個位元,而 x-1 之後設定所有位元。例如:41003011 作為二進位制數,它滿足上述條件。零不是 2 的冪,必須明確檢查。

boolean isPowerOfTwo(int x)
{
    return (x != 0) && ((x & (x - 1)) == 0);
}

左右移位的用法

我們假設,我們有三種許可權, READWRITEEXECUTE 。每個許可權的範圍從 0 到 7.(假設 4 位數系統)

RESOURCE = READ WRITE EXECUTE(12 位數)

RESOURCE = 0100 0110 0101 = 4 6 5(12 位數)

我們如何獲得(12 位數)上面設定的許可權(12 位數)?

0100 0110 0101

0000 0000 0111(&)

0000 0000 0101 = 5

因此,這就是我們如何獲得 RESOURCEEXECUTE 許可權。現在,如果我們想獲得 RESOURCE 的 READ 許可權怎麼辦? **** **** ****

0100 0110 0101

0111 0000 0000(&)

0100 0000 0000 = 1024

對?你可能會假設這個?但是,許可權是 1024.我們只想獲得資源的 READ 許可權。別擔心,這就是為什麼我們有班輪運算子。如果我們看到,READ 許可權是實際結果後面的 8 位,那麼如果應用一些移位運算子,這會將 READ 許可權帶到結果的最右邊?如果我們這樣做:

0100 0000 0000 >> 8 => 0000 0000 0100(因為它是正數,所以用 0 代替,如果你不關心標誌,只需使用無符號右移運算子)

我們現在實際上具有 4 的 READ 許可權。

現在,例如,我們獲得了 RESOURCE 的 READWRITEEXECUTE 許可權,我們可以做些什麼來為這個 RESOURCE 設定許可權? **** ****

我們首先以二進位制許可權為例。 (仍然假設 4 位數系統)

READ = 0001

WRITE = 0100

執行= 0110

如果你認為我們會這樣做:

READ | WRITE | EXECUTE,你有點對,但並不完全正確。看,如果我們將執行 READ |將會發生什麼寫| 執行

0001 | 0100 | 0110 => 0111

但是許可權實際上被表示為(在我們的示例中)為 0001 0100 0110

因此,為了做到這一點,我們知道 READ 位於 8 位後面, WRITE 位於 4 位後面, PERMISSIONS 位於最後位置。用於 RESOURCE 許可權的數字系統實際上是 12 位(在我們的示例中)。它可以(將)在不同的系統中有所不同。

(閱讀<< 8)| (WRITE << 4)| (執行)

0000 0000 0001 << 8(閱讀)

0001 0000 0000(左移 8 位)

0000 0000 0100 << 4(寫)

0000 0100 0000(左移 4 位)

0000 0000 0001(執行)

現在,如果我們新增上述變換的結果,它將是類似的;

0001 0000 0000(閱讀)

0000 0100 0000(寫)

0000 0000 0001(執行)

0001 0100 0001(許可)