[英]What does this boolean “(number & 1) == 0” mean?
在CodeReview上,我發布了一段代碼,並詢問了改進它的提示。 我得到的是使用布爾方法來檢查ArrayList是否具有偶數個索引(這是必需的)。 這是建議的代碼:
private static boolean isEven(int number)
{
return (number & 1) == 0;
}
由於我已經為那個特定用戶提供了很多幫助,我已經決定是時候糾纏SO社區了! 我真的不明白這是如何工作的。 調用該方法並將ArrayList的大小作為參數(即ArrayList具有十個元素,數字= 10)。
我知道單個&
運行數字和1的比較,但在那之后我迷路了。
我讀它的方式是,如果number == 0
和1 == 0
則返回true。 我知道第一個不是真的,后者顯然沒有意義。 有人可以幫幫我嗎?
編輯:我應該添加代碼確實有效,萬一有人想知道。
請記住,“&”是一種按位操作。 您可能已經意識到這一點,但根據您提出問題的方式,我並不完全清楚。
話雖這么說,理論上的想法是你有一些int,可以通過一些1和0的系列來表示。 例如:
...10110110
在二進制中,因為它是基數2,只要數字的按位版本以0結尾,它就是偶數,當它以1結尾時它是奇數。
因此,對於上述內容執行按位和1是:
...10110110 & ...00000001
當然,這是0,所以你可以說原始輸入是偶數。
或者,考慮一個奇數。 例如,將1添加到上面的內容中。 然后
...10110111 & ...00000001
等於1,因此不等於零。 瞧。
您可以通過其二進制表示中的最后一位確定偶數或奇數:
1 -> 00000000000000000000000000000001 (odd)
2 -> 00000000000000000000000000000010 (even)
3 -> 00000000000000000000000000000011 (odd)
4 -> 00000000000000000000000000000100 (even)
5 -> 00000000000000000000000000000101 (odd)
6 -> 00000000000000000000000000000110 (even)
7 -> 00000000000000000000000000000111 (odd)
8 -> 00000000000000000000000000001000 (even)
&
兩個整數之間是按位與運算:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
因此,如果(number & 1) == 0
為true
,則表示number
是偶數。
我們假設number == 6
,然后:
6 -> 00000000000000000000000000000110 (even)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
1 -> 00000000000000000000000000000001
-------------------------------------
0 -> 00000000000000000000000000000000
當number == 7
:
7 -> 00000000000000000000000000000111 (odd)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
1 -> 00000000000000000000000000000001
-------------------------------------
1 -> 00000000000000000000000000000001
&
是按位AND運算符。 &&
是邏輯AND運算符
在二進制中,如果設置了數位(即一位),則該數字為奇數。
在二進制中,如果位數為零,則數字為偶數。
(number & 1)
是數字位的按位 AND測試。
另一種方法是使用模數運算符%
:(可能效率更低但更容易理解):
private static boolean isEven(int number)
{
if (number < 0)
throw new ArgumentOutOfRangeException();
return (number % 2) == 0;
}
該表達式表示“整數表示偶數”。
原因如下:十進制1
的二進制表示形式為00000000001
。 所有奇數以二進制1
結尾(這很容易驗證:假設數字的二進制表示不以1
結尾;那么它由2的非零冪組成,它總是偶數)。 當您使用奇數進行二進制AND
時,結果為1
; 當您使用偶數進行二進制AND
時,結果為0
。
這曾經是優化器很差到不存在時決定奇數/偶數返回的首選方法, %
運算符需要20倍於&
運算符所采用的循環次數。 這些天,如果number % 2 == 0
,編譯器可能會生成代碼,執行速度與(number & 1) == 0
執行速度相同。
單一&
意味着逐位and
操作員不比較
因此,此代碼檢查是否設置了第bit
(最低有效/最右),這表示該數字是否為odd
; 因為所有奇數將在最低有效位中以1
結尾,例如xxxxxxx1
&
是一個按位AND
操作。
對於數字= 8:
1000
0001
& ----
0000
結果是(8 & 1) == 0
。 這是所有偶數的情況,因為它們是2的倍數,右邊的第一個二進制數字總是0. 1的二進制值為1,前導0,所以當我們AND
它的偶數時我們是留下0。
它執行二進制且對1,如果未設置最低有效位,則返回0
為你的例子
00001010(10)
00000001(1)
===========
00000000(0)
這是邏輯設計概念按位和(AND)操作符。
返回(2&1); 表示 - 將值轉換為按位數並將(AND)功能配合並返回該值。
喜歡這個鏈接http://www.roseindia.net/java/master-java/java-bitwise-and.shtml
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.