web-dev-qa-db-ja.com

ビット演算子を使用して整数が偶数か奇数かを確認するにはどうすればよいですか

ビット演算子を使用して整数が偶数か奇数かを確認するにはどうすればよいですか

56
brisk man

C(およびほとんどのCライクな言語)

if (number & 1) {
  // It's odd 
}
76
Jim Blackler

「偶数」と「奇数」が「ビット」の用語で何を意味するかを考えてください。バイナリ整数データは2の倍数を示すビットで保存されるため、最下位ビットは2に対応します、これはもちろん1ですが、すべてのotherビットは2の倍数(21 = 2、22 = 4など)。 Gratuituous ASCII art:

NNNNNNNN 
 ||||||||| 
 |||||||| +-ビット0、値= 1(2)
 |||||| + ---ビット1、値= 2(21)
 ||||| + ----ビット2、値= 4(22)
 |||| + -----ビット3、値= 8(23)
 ||| + ------ビット4、値= 16(24)
 || + --------ビット5、値= 32(25)
 | + ---------ビット6、値= 64(26)
 + ----------ビット7(最上位ビット)、値= 128(27)符号なし数値の場合、
 value = -128(-27)符号付き数値の場合(2の補数)

ここでは8ビットしか表示していませんが、あなたはそのアイデアを理解しています。

したがって、整数が偶数であるか奇数であるかは、最下位ビットのみで確認できます。設定されている場合、数値は奇数です。そうでない場合、それは均等です。他のビットは、すべて2の倍数を示すため気にしません。したがって、値を奇数にすることはできません。

wayあなたがそのビットを見ているのは、あなたの言語のAND演算子を使うことです。 CおよびBから構文的に派生した他の多くの言語(はい、B)では、その演算子は&。 BASICでは、通常はAndです。整数を取得し、かつ1(最下位ビットのみが設定された数値)と1を取り、結果が0でない場合、ビットが設定されました。

私は意図的にnotを実際に使用しています。これは、使用している言語がわからないだけでなく、質問に「宿題」とマークしたためです。 :-)

126
T.J. Crowder
if (number & 1)
    number is odd
else // (number & 1) == 0
    number is even

たとえば、奇数の整数25を使用してみましょう。バイナリ25では00011001。最下位ビットb0は1であることに注意してください。

00011001    
00000001   (00000001 is 1 in binary)
       &
--------
00000001
19
T M

ジムの答えへの単なる脚注。

C#では、Cとは異なり、ビット単位のANDは結果の数値を返すため、次のように記述します。

if ((number & 1) == 1) {
   // It's odd
}
12
neontapir
if(x & 1)                               // '&' is a bit-wise AND operator
    printf("%d is ODD\n", x);
else
    printf("%d is EVEN\n", x);

例:

    For 9:

      9 ->        1 0 0 1
      1 ->     &  0 0 0 1
      -------------------
      result->    0 0 0 1

したがって、すべての奇数の右端のビットは1なので、9 AND 1は1を返します。

     For 14:

       14 ->      1 1 1 0
       1  ->   &  0 0 0 1
       ------------------
       result->   0 0 0 0

したがって、14 AND 1は0を返します。これは、すべての偶数の右端のビットが0であるためです。

7
Aditya Goel

ビット単位のAND &演算子を使用して簡単に実行できます。

if(num & 1)
{
    //I am odd number.
}

続きを読む- Cでビット演算子を使用して奇数をチェックする

1
Pankaj Prakash
#include <iostream>
#include <algorithm>
#include <vector>

void BitConvert(int num, std::vector<int> &array){
    while (num > 0){
        array.Push_back(num % 2);
        num = num / 2;
    }
}

void CheckEven(int num){
    std::vector<int> array;
    BitConvert(num, array);
    if (array[0] == 0)
        std::cout << "Number is even";
    else
        std::cout << "Number is odd";
}

int main(){
    int num;
    std::cout << "Enter a number:";
    std::cin >> num;

    CheckEven(num);
    std::cout << std::endl;

    return 0;
}
0
Testing123

また、Javaでは、if((number&1)==1){//then odd}を使用する必要があります。なぜなら、JavaおよびC#のような言語では、intbooleanにキャストされます。CおよびC++のような言語とは異なり、boolean値、つまりtrueおよびfalseを返すには関係演算子を使用する必要があります。 trueとしてのゼロ以外の値。

0
therahulkumar