按位逻辑运算符和移位运算符

Bitwise logical operator and shift operator

此代码是书中的示例,该问题需要使用按位 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 函数和 return 计数位 (~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 表示将 31 右移 10?

如何产生1010?

这段代码实际比较产生了什么 1010

实际上程序也产生了 32 数字,最后是 1010

print_bits(unsigned x):

代码使用& 1u取十进制数的最后一位(与& 0000000000000001相同),然后使用三元运算符放一个'1'如果最后一位是1 (true) 和 0 如果最后一位是 0 (false)。该数字也在每一步中再右移一位(由于 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,同时递增 bits,存储位数。 x 仅在 x1 时才右移, 从而使 x 中的所有 1 都设置为 0(我只想 每次迭代都将 x 右移(结果相同)。

int_bits(void) 将 count_bits 中的所有 0 转换为 1,以便循环知道何时停止