我的程序应扫描某个数字(无符号长整数),并返回其奇数的“打开”索引位(从数字的二进制表示形式开始)。但该程序无法识别任何数字,仅返回0,或,完全不响应该数字。我在做什么错了?
这是功能:
int count_odd_bits(unsigned long int x) {
int count = 0;
while (x) {
if ((x % 2 == 1) && (x & 1))
count++;
else
x = x << 1;
}
return count;
}
这是主要功能:
int main() {
unsigned long int x;
printf("\n enter a number: \n");
scanf("%ul", &x);
int count_odd_bits(unsigned long int x);
printf("\n the result is:%d \n",count_odd_bits(x));
return 0;
}
对于数字149,应返回1 (只有第7位打开)
答案 0 :(得分:2)
在函数中,x
为true时不会更改if
。因此,您将陷入无休止的循环。
int count_odd_bits(unsigned long int x) {
int count = 0;
while (x) {
if ((x % 2 == 1) && (x & 1))
count++; // x not changed --> endless loop!!
else
x = x << 1;
}
return count;
}
另外,您似乎需要x = x >> 1;
而不是当前代码。
您也不需要x % 2 == 1
和x & 1
,因为它们是相同的。
所以计算个数的代码可能是:
int count_odd_bits(unsigned long int x) {
int count = 0;
while (x) {
if (x & 1) count++;
x = x >> 1;
}
return count;
}
如果您只想计算奇数位的位置
int count_odd_bits(unsigned long int x) {
int count = 0;
x = x >> 1; // get rid of bit zero
while (x) {
if (x & 1) count++;
x = x >> 2; // shift by 2 to get 1->3->5->....
}
return count;
}