此代码是书中的一个示例,该问题需要使用按位运算AND
符和运算符将十进制数更改为二进制数shift
。尽管曾尝试使用调试编译器理解此代码,但我无法理解该代码。
假设对于a
和b
用户输入10
和8
#include <stdio.h>
#include <stdlib.h>
int count_bits (unsigned x)
{
int bits=0;
while(x){
if (x&1U)bits++;
x>>=1;
} return bits;
}
int int_bits(void)
{
return count_bits(~0U);
}
void print_bits(unsigned x)
{
int i;
for(i=int_bits(x)-1;i>=0;i--)
putchar(((x>>i)&1U)?'1':'0');
}
int main(void)
{
unsigned a,b; /*suppose user input a=10 b=8*/
printf("enter two positive integer value=\n");
printf("a= "); scanf("%u",&a);
printf("b: "); scanf("%u",&b);
printf("\na ="); print_bits(a);
printf("\na ="); print_bits(b);
return 0;
}
在int_bits
功能上实际上(~0U)
做了什么?我这个意思改0
到1
?
我知道它调用count_bits
函数并返回计数位(~0)值但为什么x
这里有点像随机内存地址4294967295
?
也许是因为int int_bits(void)
和int_bits()
所以没有参数,并x
从变化10
到一个随机地址?
而count_bits
函数是在这里计算多少位?
while (4294967295) {
if(x&1u)-> (means compare x last digit value with 1) if true, bits ++;
x>>=1; }-> this mean to shift 1 digit of x to right which mean to divide with 2 until quotien is 0
当我尝试调试时,我得到32
了位值
为什么产生32
?这与(~0U)
所有位1
或分裂的遗迹有关吗?
print_bits (unsigned x) function, is to produce the result
for(i=int_bits()-1;i>=0;i--)
putchar(((x>>i)&1u)?'1':'0')
the x in this value is 10,8 (user input)
and i is 31 from return bits
32-1=31 will be looping until 0
10>>30
意味着31
向右移动只是10
?
它怎么能生产1010
?
这段代码实际上与生产相比是1010
什么?
其实程序最后也会产生32
数字1010
。
print_bits(unsigned x):
代码使用& 1u
(与 相同& 0000000000000001
)获取十进制数的最后一位,然后使用三元运算符'1'
在最后一位为1
(true) 和0
最后一位为0
(false) 时放入 a 。该数字还在每一步中右移一位(由于i
递增),以便使用 获得每一位& 1u
。
的&
(和)运算符比较在两个数各对应位,并创建一个位1
,如果有两个1
的和0
的在所有其他情况下。
这:
int i = (0101/**/0111) & (0010/**/0101);
会给i
这个值:
0000/**/0000/**/0000/**/0101 // The addition of two sets of 4 0's on the
//left was due to me assuming int is 32 bits in your system.
将其右移1
( >> 1
):
1101
会产生这个:
0110
多次移位允许三元语句检查所有位。
count_bits (unsigned x):
x
评估的最低位以查看它是否为1
,同时增加位以存储位数。x
仅在x
is 时右移1
,从而使所有1
的 inx
都设置为0
(我会在x
每次迭代位时右移(结果将相同)。
int_bits(void) 将 count_bits 中的所有 0 转换为 1,以便它可以用作循环知道何时停止的一种方式
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句