使用按位运算符计算 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) {
我正在用 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) {