ビット演算子を使用して整数が偶数か奇数かを確認するにはどうすればよいですか
C(およびほとんどのCライクな言語)
if (number & 1) {
// It's odd
}
「偶数」と「奇数」が「ビット」の用語で何を意味するかを考えてください。バイナリ整数データは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を実際に使用しています。これは、使用している言語がわからないだけでなく、質問に「宿題」とマークしたためです。 :-)
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
ジムの答えへの単なる脚注。
C#では、Cとは異なり、ビット単位のANDは結果の数値を返すため、次のように記述します。
if ((number & 1) == 1) {
// It's odd
}
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であるためです。
#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;
}
また、Javaでは、if((number&1)==1){//then odd}
を使用する必要があります。なぜなら、JavaおよびC#のような言語では、int
はboolean
にキャストされます。CおよびC++のような言語とは異なり、boolean
値、つまりtrue
およびfalse
を返すには関係演算子を使用する必要があります。 true
としてのゼロ以外の値。