此代码是一本书中的一个例子,问题需要使用按位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
意味着在10
内将31
向右移动?
它如何产生1010
?
这段代码实际上比较什么来产生1010
?
实际上,该程序还最终生成带有1010
32
数字。
print_bits(unsigned x):
代码使用& 1u
获取十进制数的最后一位(与& 0000000000000001
相同),然后使用三元运算符在最后一位为1
(true) 时放置一个'1'
,如果最后一位为0
(false),则放置0
。该数字在每个步骤中也会再向右移动一位(由于i
递增),以便通过使用& 1u
获得每个位。
&
(and)运算符在两个数字中比较每个相应的位,如果有两个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
只有在1
x
时才向右移动, 从而使x
中的所有1
都设置为0
(我本来可以 每次迭代位时x
右移(结果将是相同的)。
int_bits(void) 将 count_bits 中的所有 0 转换为 1,以便它可以用作循环知道何时停止的一种方式