簡體   English   中英

這個布爾“(數字&1)== 0”是什么意思?

[英]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 == 01 == 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) == 0true ,則表示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。

Java中的&運算符是按位運算符。 基本上, (number & 1)執行按位 - 並且在number1之間執行。 結果為0或1,具體取決於它是偶數還是奇數。 然后將結果與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.

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