C语言 按位逻辑运算符和移位运算符



此代码是一本书中的一个例子,问题需要使用按位AND运算符和shift运算符将十进制数更改为二进制数。 我无法理解代码,尽管我试图使用调试编译器理解这段代码。

假设对于ab,用户输入是108

#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()所以没有参数和x10更改为随机地址?

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

实际上,该程序还最终生成带有101032数字。

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只有在1x时才向右移动, 从而使x中的所有1都设置为0(我本来可以 每次迭代位时x右移(结果将是相同的)。

int_bits(void) 将 count_bits 中的所有 0 转换为 1,以便它可以用作循环知道何时停止的一种方式

最新更新