程序不扫描数字149,对于任何其他数字,它返回0

时间:2019-03-23 13:05:41

标签: c

我的程序应扫描某个数字(无符号长整数),并返回其奇数的“打开”索引位(从数字的二进制表示形式开始)。但该程序无法识别任何数字,仅返回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位打开)

1 个答案:

答案 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 == 1x & 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;
}