此代码是一本书中的示例,该问题需要使用按位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
。
答案 0 :(得分:1)
print_bits(unsigned x):
代码使用& 1u
(与& 0000000000000001
相同)获取十进制数的最后一位,然后如果最后一位为{{,则使用三元运算符放置'1'
1}}(true)和1
如果最后一位是0
(false)。在每一步中,该数字也会向右移一位(由于0
递增),以便通过i
获得每一位。
& 1u
(和)运算符将两个数字中的每个对应位进行比较,如果有两个&
,则创建一个1
位,{{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
中的所有1
都设置为1
(我会做的)
每次迭代都会向x
移位(结果会相同)。
int_bits(void)将count_bits中的所有0转换为1,以便它可以用作循环知道何时停止的方式