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

时间:2017-05-22 11:19:02

标签: c bitwise-operators bit

我正在使用C中的按位运算符编写程序。它用于学校作业,目标是计算整数的位表示中的1的数量,然后如果结果是偶数则打印“偶数”并且“奇怪的“如果它很奇怪。

我编写了一个循环遍历每个位的程序,并将输入的整数与掩码进行比较,并在每次按位AND运算符返回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");
    }
}

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

5 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

你改错了方法:

value >>= 1;

假设int为32位,displayMask = 1 << 31设置的最高顺序为displayMask。当你将该值偏移1时,单个设置位会移出,因此你的掩码现在为0。

改为右移。

value >>= 1;

您的比较也不正确:

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

仅当掩码为1且低位设置时才会出现这种情况。而是检查结果是否为非零:

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

答案 2 :(得分:0)

看一下

if( (value & displayMask) == 1)

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

答案 3 :(得分: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) {

答案 4 :(得分:0)

unsigned
count_ones(unsigned u) {
  unsigned foo=u;
  do while(foo-=u>>=1, u);
  return foo;
}