使用按位运算符计算 1 的个数

Using Bitwise Operators to Count the Number of 1's

我正在用 C 编写一个使用按位运算符的程序。它用于学校作业,objective 用于计算整数的位表示中 1 的个数,然后打印 "Even" 如果结果是偶数,"Odd" 如果结果是奇数。

我编写了一个程序来遍历每一位并将输入的整数与掩码进行比较,并为每次按位与运算符 returns 1 增加一个计数器变量。但是,该程序似乎没有递增计数器变量。这是代码:

#include <stdio.h>

void bitsEvenOrOdd(int value);

int main(void) {
    int integer;

    printf("Enter an integer: ");
    scanf("%d", &integer);

    bitsEvenOrOdd(integer);

    return 0;
}

void bitsEvenOrOdd(int value) {
    unsigned int displayMask;
    unsigned int i;
    unsigned int counter;

    counter = 0;
    displayMask = 1 << 31;

    for (i = 0; i < 32; i++) {
        if ((value & displayMask) == 1) {
            counter++;
        }
        value <<= 1;
    }

    if ((counter % 2) == 0) {
        printf("The total number of 1's in the bit representation is even.\n");
    }
    else {
        printf("The total number of 1's in the bit representation is odd.\n");
    }
}

非常感谢任何建议或提示。谢谢!

你换错方向了:

value >>= 1;

假设 int 是 32 位,displayMask = 1 << 31 设置最高位但在 displayMask 中。当您将该值左移 1 时,单个设置位被移出,因此您的掩码现在为 0。

改为右移。

value >>= 1;

你的比较也不正确:

if ((value & displayMask) == 1) {

只有当掩码为 1 且设置了低位时,这才会成立。相反,检查结果是否为非零:

if ((value & displayMask) != 0) {

看行

if( (value & displayMask) == 1)

并考虑当 displayMask 为 2、4、8 等时会发生什么

if ((value & displayMask) == 1) {

考虑这个操作。 displayMask 是 0x80000000。按位和该数字与任何其他数字之间只能是 0x80000000 或 0。您正在将它与 1 进行比较。

要么比较它是否不等于 0,要么(我建议这样做)检查最低位集并右移而不是左移。

您应该检查最低位以解决问题。考虑您的代码中的以下更改

         unsigned int counter;

         counter = 0;
    -    displayMask = 1 << 31;
    +    displayMask = 1;

         for (i = 0; i < 32; i++) {
         if ((value & displayMask) == 1) {
         counter++;
         }
     -        value <<= 1;
     +        value >>= 1;
     }

 if ((counter % 2) == 0) {