明解c语言 第七章 7-6

有点问题不太懂
这是明解c语言的代码清单7-6的函数部分

int count_bits(unsigned x)
{
    int bits = 0;
    while (x)
    {
        if (x & 1U)
            bits++;
            x >>= 1;
    } //返回整数x中设置的位数
    return bits;
}
int int_bits()
{
    return count_bits(~0U);
}//返回unsigned型的位数
void print_bits(unsigned x)
{
    int i;
    for (i = int_bits() - 1; i >= 0; i--)
        putchar(((x >> i) & 1U) ? '1' : '0');
}// 显示unsigned型的位的内容

我觉得第一部分代码 也就是count_bits部分的代码是显示位数
那么如果我想检验7 这个数字 那不应该输出3 么
但结果好像不是这样
我肯定有哪点不懂
希望各位可以帮忙

还有想问一下 c中有什么简单的方法监视函数内部的运行情况吗?

输出3个1,算出一个数的位数 然后把每一位输出 应该是显示二进制的数

我现在懂了 它就是算出来有这个类型占的位数