檢查數字是否為 2 的冪
如果整數 x
是 2 的冪,則只設定一個位元,而 x-1
之後設定所有位元。例如:4
是 100
而 3
是 011
作為二進位制數,它滿足上述條件。零不是 2 的冪,必須明確檢查。
boolean isPowerOfTwo(int x)
{
return (x != 0) && ((x & (x - 1)) == 0);
}
左右移位的用法
我們假設,我們有三種許可權, READ , WRITE 和 EXECUTE 。每個許可權的範圍從 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
因此,這就是我們如何獲得 RESOURCE 的 EXECUTE 許可權。現在,如果我們想獲得 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 的 READ , WRITE , EXECUTE 許可權,我們可以做些什麼來為這個 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(許可)