我正在使用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");
}
}
非常感谢任何建议或提示。谢谢!
答案 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;
}