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

73

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

12个回答

151
考虑在“位”术语中“偶数”和“奇数”是什么意思。由于二进制整数数据存储的位表示2的倍数,最低位对应于20,也就是1,而所有其它位都对应于2的倍数(21=2, 22=4等)。ASCII艺术表格如下:
NNNNNNNN
||||||||
|||||||+−− 第 0 位,值为1(20)
||||||+−−− 第 1 位,值为2(21)
|||||+−−−− 第 2 位,值为4(22)
||||+−−−−− 第 3 位,值为8(23)
|||+−−−−−− 第 4 位,值为16(24)
||+−−−−−−− 第 5 位,值为32(25)
|+−−−−−−−− 第 6 位,值为64(26)
+−−−−−−−−− 第 7 位(最高位),值为128(27)对于无符号数,
                 值为-128(-27)对于有符号数(二进制补码)

这里只显示了8位,但你可以理解这个规律。

所以你可以通过只观察最低位来判断一个整数是偶数还是奇数:如果它被设置了,那么这个数字就是奇数。如果没有,那么它是偶数。你不关心其他位,因为它们都表示2的倍数,所以它们不能使值成为奇数。

使用您的编程语言中的AND运算符来查看那个位。在C和许多从B(是的,B)语法派生的其他语言中,该操作符为“&”。在BASIC中,通常为“And”。用整数与1进行AND运算(1是仅设置了最低位的数字),如果结果不等于0,则该位已设置。 我故意没有给出代码,不仅因为我不知道您使用的是哪种语言,而且还因为您将问题标记为“作业”。

103

在 C 语言(以及大多数类 C 语言)中

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

30
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

18

作为Jim答案的一个注脚。

在C#中,与运算符返回结果数字,不像C语言那样,所以你需要这样写:

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

1
我不懂C#(问题标记为C),但这有什么区别吗?number&1将返回0或1。例如,在C#中,如果您编写if(8),那么8是否会被评估为true - Shahbaz
1
不同于C语言,在C#中,整数不会自动转换为布尔值,因此您会收到编译错误:“常量值'8'无法转换为'bool'”。因此需要额外的语法。我将这个答案作为“脚注”放在这里,以便像我一样需要在C#中使用它的人能够使用它。 - neontapir
7
在C#中,与C不同的是位与运算符返回结果数字。在C中,位与运算符也会返回结果数字,如果不返回结果数字的话将会是相当无用的。区别在于,在C中,if语句可以用于任何整数类型,但在C#中不能,而不是位运算符的结果。 - T.J. Crowder
我的理解是,在C中,按位与返回一个布尔结果,而在C#中返回值或0。请查看原帖和我的答案中的代码示例,以了解差异。 - neontapir
3
当对整数使用 & 运算符时,根据定义会返回一个整数。例如 8 & 1 的结果为0。然而,在C语言中,if语句将把0转换为false,任何非零数字转换为true。 - JimmyMcHoover
显示剩余2条评论

10
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和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。


3

在Java中,您需要使用if((number&1)==1){//then odd},因为在Java和类似C#的语言中,int类型不能被转换为boolean类型。您必须使用关系运算符返回一个boolean值,即truefalse,而不像C和C++等语言将非零值视为true


2

2
Check Number is Even or Odd using XOR Operator 

Number = 11 
  1011  - 11 in Binary Format 
^ 0001  - 1 in Binary Format 
  ----
  1010  - 10 in Binary Format 

Number = 14 

  1110  - 14 in Binary Format 
^ 0001  - 1 in Binary Format 
  ----
  1111  - 15 in Binary Format 

AS It can observe XOR Of a number with 1, increments it by 1 if it is 
even, decrements it by 1 if it is odd. 

代码:

if((n^1) == (n+1))
    cout<<"even\n";
else
    cout<<"odd\n";

这个回答并没有回答到问题。不要使用难以理解的复杂答案,而是使用AND。这就是它存在的原因...cout << (n & 0x01) ? "odd\n" : "even\n"; - Daniel Rudy

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

1
在Java中,
if((num & 1)==0){
//its an even num
}
//otherwise its an odd num

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接