80

CodeReviewで、動作するコードを投稿し、それを改善するためのヒントを求めました。私が得たのは、ブール値メソッドを使用して、ArrayList に偶数のインデックスがあるかどうかを確認することでした (これは必須でした)。これは提案されたコードでした:

private static boolean isEven(int number)
{
    return (number & 1) == 0;
}

私はすでにその特定のユーザーに多くの助けを求めてせがんだので、SO コミュニティにせがむ時が来たと判断しました! これがどのように機能するのかよくわかりません。メソッドが呼び出され、ArrayList のサイズをパラメーターとして受け取ります (つまり、ArrayList には 10 個の要素があり、番号 = 10)。

数字と 1 の両方の比較を 1 回実行することは知ってい&ますが、その後は迷子になりました。

number == 0私がそれを読んだ方法は、 と の場合にtrue を返すと言っています1 == 0。前者は真実ではなく、後者は明らかに意味をなさないことを私は知っています。誰か助けてくれませんか?

編集:誰かが疑問に思っている場合に備えて、コードが機能することをおそらく追加する必要があります。

4

9 に答える 9

115

「&」はビット演算であることに注意してください。あなたはおそらくこれを認識していますが、あなたが質問を提起した方法に基づいて、私には完全に明確ではありません.

そうは言っても、理論的な考え方は、一連の 1 と 0 によってビットで表現できる int があるということです。例えば:

...10110110

バイナリでは、基数が 2 であるため、数値のビットごとのバージョンが 0 で終わるときは常に偶数であり、1 で終わるときは奇数です。

したがって、上記に対して 1 でビット単位の & を実行すると、次のようになります。

...10110110 & ...00000001

もちろん、これは 0 なので、元の入力は偶数だったと言えます。

あるいは、奇数を考えてみましょう。たとえば、上記の値に 1 を追加します。それで

...10110111 & ...00000001

は 1 に等しいため、ゼロには等しくありません。出来上がり。

于 2013-02-16T00:49:16.977 に答える
70

バイナリ表現の最後のビットによって、数値が偶数か奇数かを判断できます。

1 -> 00000000000000000000000000000001 (odd)
2 -> 00000000000000000000000000000010 (even)
3 -> 00000000000000000000000000000011 (odd)
4 -> 00000000000000000000000000000100 (even)
5 -> 00000000000000000000000000000101 (odd)
6 -> 00000000000000000000000000000110 (even)
7 -> 00000000000000000000000000000111 (odd)
8 -> 00000000000000000000000000001000 (even)

&2 つの整数の間は、ビットごとの AND 演算子です。

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
于 2013-02-16T01:08:50.753 に答える
18

&ビットごとの AND 演算子です。&&は論理 AND 演算子です

2 進数では、桁数ビットが設定されている (つまり 1) 場合、その数は奇数です。

2 進数では、桁数ビットがゼロの場合、数値は偶数です。

(number & 1) 数字ビットのビットごとの AND テストです。

これを行う別の方法 (おそらく効率は劣るがより理解しやすい) は、モジュラス演算子を使用すること%です。

private static boolean isEven(int number)
{
    if (number < 0)
       throw new ArgumentOutOfRangeException();

    return (number % 2) == 0;
}
于 2013-02-16T00:45:00.387 に答える
8

この表現は「整数は偶数を表す」という意味です。

理由は次のとおりです。10 進数のバイナリ表現1は です00000000001。すべての奇数1は 2 進数で で終わります (これは簡単に確認できます。数値の 2 進数表現が で終わらない1場合、2 のゼロでない累乗で構成され、常に偶数になります)。AND奇数でバイナリを実行すると、結果は次のようになり1ます。AND偶数でバイナリを実行すると、結果は になり0ます。

これは、オプティマイザーが貧弱で存在しなかった時代に奇数/偶数を決定するための推奨される方法であり、%オペレーターはオペレーターが取るサイクル数の 20 倍を必要としていました&。最近では、これを行うnumber % 2 == 0と、コンパイラは実行速度と同じくらい速く実行されるコードを生成する可能性が(number & 1) == 0あります。

于 2013-02-16T00:45:19.100 に答える
5

シングルは、比較ではなく&ビット単位のand演算子を意味します

したがって、このコードは、最初のbit(最下位/最右) が設定されているかどうかをチェックします。これは、数値が設定されているかどうかを示しoddます。すべての奇数は1最下位ビットで終わるため、たとえばxxxxxxx1

于 2013-02-16T00:45:30.310 に答える
4

&はビットAND演算です。

数値 = 8 の場合:

  1000
  0001
& ----
  0000

その結果、(8 & 1) == 0. 偶数はすべて 2 の倍数であり、右から 1 番目の 2 進数は常に 0 であるため、これはすべての偶数に当てはまりANDます。 0で。

于 2013-02-16T00:53:51.800 に答える
3

Javaの&演算子は、ビットごとの AND 演算子です。基本的に、と の間で(number & 1)ビット単位の AND を実行します。偶数か奇数かによって、結果は 0 または 1 になります。次に、結果が 0 と比較され、偶数かどうかが判断されます。number1

これは、ビット単位の操作を説明するページです。

于 2013-02-16T00:45:53.947 に答える
3

これが論理設計コンセプトのビット単位 & (AND) 演算子です。

リターン (2 & 1); 手段 - 値をビット単位の数値に変換し、(AND) 機能を比較して、値を返します。

このリンクを好むhttp://www.roseindia.net/java/master-java/java-bitwise-and.shtml

于 2013-02-16T07:34:00.293 に答える
3

バイナリを実行し、1 に対して実行します。最下位ビットが設定されていない場合は 0 を返します。

あなたの例のために

00001010 (10)

00000001 (1)

===========

00000000 (0)

于 2013-02-16T00:49:02.627 に答える