统计x中值替1的二进制位数
统计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;
}