如何使用按位运算符检查整数是偶数还是奇数

如何使用按位运算符检查整数是偶数还是奇数

在C(和大多数C语言)

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

考虑什么是“偶”和“奇”是用“位”来表示的。 由于二进制整数数据以表示倍数2的比特进行存储,所以最低位将对应于2 0 ,当然是1,而所有其他比特将对应于2的倍数(2 1 = 2,2 2 = 4等)。 免费的ASCII艺术:

  NNNNNNNN
 

||

| + – 位0,值= 1(2 0

+ — bit 1,value = 2(2 1

|| + —-位2,值= 4(2 2

| + —– bit 3,value = 8(2 3

+ ——位4,值= 16(2 4
|| + ——-位5,值= 32(2 5
| + ——–位6,值= 64(2 6
+ ———位7(最高位位),值= 128(2 7 )为无符号数,
值为-128(-2 7 )为有符号数(2的补码)

我只显示了8位,但你明白了。

所以你可以通过只查看最低位来判断一个整数是偶数还是奇数:如果设置了,则数字是奇数。 如果不是,那甚至是。 你不关心其他位,因为它们都表示2的倍数,所以它们不能使值奇数。

你看那个位的方法是使用你的语言的AND运算符。 在C语言和许多其他语言从B语言(是,B)语法派生,该运算符是& 。 在BASIC中,通常是And 。 你把你的整数,并与1(这是一个只有最低阶位集的数字),如果结果不等于0,该位被设置。

我故意没有在这里给代码实际上,不仅因为我不知道你在用什么语言,而且因为你标记了“家庭作业”这个问题。 🙂

 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 

所以9 AND 1给我们1,因为每个奇数的最右边的位是1。

  For 14: 14 -> 1 1 1 0 1 -> & 0 0 0 1 ------------------ result-> 0 0 0 0 

所以14 AND 1给我们0,因为每个偶数的最右边的位是0。

你可以简单地使用按位AND &运算符来完成。

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

在这里阅读更多 – 使用C中的按位运算符检查奇数

同样在Java中,你将不得不使用if((number&1)==1){//then odd} ,因为在Java和C#类似的语言中, int不会被转换为boolean 。 您不得不使用关系运算符来返回一个boolean值,也就是说truefalse而不像C和C ++那样将非零值视为true

 #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; }