首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

统计x中值替1的二进制位数

2013-01-23 
统计x中值为1的二进制位数我在看《C程序设计语言》第二版中文版的时候,看到这样一个例子:定义了一个函数bitc

统计x中值为1的二进制位数
我在看《C程序设计语言》第二版中文版的时候,看到这样一个例子:

定义了一个函数bitcount,用来统计x中值为1的二进制位数


int bitcount(unsigned x)
{
    int b;
    
    for (b = 0; x != 0; x >>= 1)
    {
        if (x & 01)
        {
            b++;
        }

        return b;
    }
}


这其中的for循环中的条件3         x >>= 1,这其中我有两个疑问:
1:表达式  x >> = 1 指的是x右移出的那一个二进制位还是指的是x右移出一个二进制位之后剩下的那个数,
2:如果x右一位,那x本身的值变不变?比如说  x >>= 1这个表达式,执行这个之后x本身的值会因为移位而变动吗?


还有另外一个疑问:
3:其中的 x & 01   中的 01值应该是八进制数1吧,相当于3位二进制数001。 c 移位
[解决办法]
1. 代表剩下的数
2. 变,相当于 x = x/2
3.  不管是几进制,总之是1比特的1

[解决办法]
1.2.把X向右移动以为的话,右边的一位移出去不要,高位补零或者补符号位(这个要看是逻辑右移还是算术右移了),所以肯定是剩下的数量,而且肯定会变了,就上楼上说的,此时X=X/2

3.“01”不管是八进制,十进制还是十六进制,其实最右边的比特位就是1。
0000 0001八位
0000 0000 0000 0001十六位
[解决办法]
整个程序的思路是,x逐bit右移,然后判断bit0是否是1,直到右移完成,则包含1的bit数就计算出来。
1.指的是x右移出一个二进制位之后剩下的那个数
2.变,其实相当于 x = x >> 1,这与+= ,-=的用法是一样的
3.是8进制的1,但是它也表示bit0是1,其他bit为0。你也可以改成0x1,或者1,都没问题。
[解决办法]
首先你的代码是错误,return语句应该再for循环外面,这样改才对:

int bitcount(unsigned int x)
{
int b;
     
for(b = 0; x != 0; x >>= 1)
{
if(x & 01)
{
b++;
}
}

return b;
}


其次,我改写为以下的逻辑顺序,你会更容易理解一些:

int bitcount(unsigned int x)
{
int b = 0;
     
while(x != 0)
{
if(x & 1) b++;
x = x >> 1;
}

return b;
}


引用:
我在看《C程序设计语言》第二版中文版的时候,看到这样一个例子:

定义了一个函数bitcount,用来统计x中值为1的二进制位数

C/C++ code?1234567891011121314int bitcount(unsigned x){    int b;         for (b = 0; x != 0; x >>= 1)    {        if……

热点排行