我們已經進入本系列的最後一章了,終於是時候簡單了解一下位元操作了。
依照維基百科的定義,位元運算在位元串、位元組或二元數字(被視為位元串)的各個位元層級上進行運算。
我們先用二進位(基數 2)表示一個數字。我們可以對數字使用 toString 方法,並指定 基數:
我們也可以解析一個整數,給它一個基數:
請注意,我們也可以表示帶有前綴 0b 的二進位數:
例如,這些是相同的數字:
JavaScript 中所有位元運算都是對 32 位元二進位數執行的。
也就是說,在執行位元運算之前,JavaScript 將數字轉換為 32 位元 **有符號* 整數。 *
例如,17 不會只是 10001,而是 00000000 00000000 00000000 00010001。
執行位元運算後,結果將轉換回 64 位元 JavaScript 數字。
如果兩位都是 1,則結果為 1,否則為 0。
Note |
---|
The GIFs below show the numbers as 8-bit strings, but when doing bitwise operations, remember they are converted to 32-bit numbers. |
若任一位為 1,則結果為 1,否則為 0。
若各位不同(一位為1,一位為0),則結果為1,否則為0。
翻轉位(1 變為 0,0 變為 1)。
Note |
---|
Bitwise NOTing any 32-bit integer x yields -(x 1). |
如果我們使用輔助函數來查看二進位表示,它正如我們所期望的:
最左邊的位表示訊號 - 數字是負數還是正數。
請記住,我們說過 JavaScript 使用 32 位元帶符號整數進行位元運算。
最左邊的位元為 1 表示負數,0 表示正數。
此外,運算子對操作數的二進位補碼位元表示進行運算。 對每一位應用運算符,並以位元建構結果。
請注意,二進位補碼允許我們獲得帶有反訊號的數字。
一種方法是反轉正數表示中數字的位元並加 1:
將給定數量的位數向左移動,並添加從右側移入的零位。
請注意,第 32 位(最左邊的一位)被丟棄。
將給定位數向右移動,在從左側添加位時保留符號。
將給定位數向右移動,從左側加位時加上 0,無論符號為何。
要取得特定位,我們首先需要建立一個位元遮罩.
我們可以透過將 1 向左移動我們想要取得的位元的索引來實現這一點。
結果是二進制數和位元遮罩的 和 。
但是,使用JavaScript,我們也可以透過索引進行無符號右移,將位元放在第一位(這樣我們就無法得到該位置的實際值,但它是否是1或 0):
例如,我們嘗試 13,二進位為 1101:
如果我們想將一位變成 1(換句話說,「設定一點」),我們可以做類似的事情。
首先,我們可以透過將 1 向左移動我們想要設定為 1 的位元的索引來再次建立位元遮罩。
結果是數字和位元遮罩的 或 :
請記住,在我們的範例中,13 在二進位中是 1101,假設我們要在索引 1 處設定 0:
我們簡要地了解了位元運算,以及取得/設定位。在最後一章中,我們將從 1 位數開始討論五個問題。在那之前,祝您編碼愉快。
以上是LeetCode 冥想-章節位元操作的詳細內容。更多資訊請關注PHP中文網其他相關文章!