6

条件がビット演算子でどのように機能するかを理解しようとしました。数値が偶数か奇数かを確認する方法は、次の方法で実行できます。

#include <iostream>
#include <string>
using namespace std;

string test()
{
    int i = 8;  //a number
    if(i & 1)
      return "odd";

    else
      return "even";       
}

int main ()
{
  cout << test();
  return 0;
}

私が理解していない部分は、if条件がどのように機能するかです。この場合、i = 8の場合、それが実行しているin Ifステートメントは、1000 & 18に等しい1000を返す必要があります。

i = 7の場合、ifステートメントでは、111 & 17に等しい111を返すことを実行する必要があります。

if(8)が「even」を返し、if(7)が「odd」を返すのはなぜですか?ビット単位の演算子を処理するときに、ifステートメントがTrueであるか、Falseであるかを理解したいと思います。

私がこの質問を書き留めたときの考えは、それが実際にやっているからです

for 8: 1000 & 0001 which gives 0
for 7: 0111 & 0001 which gives 1?
4

5 に答える 5

16

はい、あなたは最後の部分で正しいです。バイナリ&であり、|ビットごとに実行されます。以来

1 & 1 == 1
1 & 0 == 0
0 & 1 == 0
0 & 0 == 0

私たちはそれを見ることができます:

8 & 1 == 1000 & 0001 == 0000

7 & 1 == 0111 & 0001 == 0001

ただしtest、関数は、数値が偶数か奇数かを正しく計算します。これは、奇数の場合にのみ存在する1の位にが存在a & 1するかどうかをテストするためです。1

于 2012-10-24T17:24:08.337 に答える
4

実際、C、C ++、およびその他の主要なプログラミング言語では、&演算子はAND整数型の各ビットで演算を実行します。ビット単位のn番目のANDビットは、両方のオペランドのn番目のビットが1に等しい場合にのみ、1に等しくなります。

例えば:

8 & 1 =
1000 - 8
0001 - 1
----
0000 - 0

7 & 1 =
0111 - 7
0001 - 1
----
0001 - 1

7 & 5 =
0111 - 7
0101 - 5
----
0101 - 5

このためAND、偶数と奇数の間でビット単位で実行すると、最下位ビットがに等しいのは奇数だけであるため、1常に等しくなります。01

于 2012-10-24T17:29:00.123 に答える
3

if(x)C++ではxブール値に変換されます。整数はtrue、ゼロ以外の場合に考慮されます。

したがって、実行しif(i & 1)ているのは、最下位ビットがに設定されているかどうかを確認することだけですi。設定されている場合、i&1ゼロ以外になります。設定されていない場合はi&1ゼロになります。

整数が奇数の場合、最下位ビットは整数に設定されます。したがって、整数が奇数の場合、i&1非ゼロになりiます。

于 2012-10-24T17:25:16.773 に答える
2

i & 1、ここiで、はint、タイプがintです。その値は、の下位ビットの値に応じて、1またはです。ステートメントでは、その式の結果は、整数型の通常の規則に従って、に変換されます。になり、非ゼロはになります。0iif(i & 1)bool0falsetrue

于 2012-10-24T17:24:55.327 に答える
2

コードが実行していると言うのは、実際にはビット単位の演算子がどのように機能するかということです。(8&1)の例では:

1000 & 0001 = 0000

最初の値では最後のビットが0に設定され、2番目の値では最後のビットが1に設定されているためです。0&1=0。

0111 & 0001 = 0001

どちらの値でも、最後のビットは1に設定されているため、1&1 = 1であるため、結果は1になります。

于 2012-10-24T17:25:01.210 に答える