谁能给我解释一下这个按位函数中的putchar行吗?

谁能给我解释一下这个按位函数中的putchar行吗?,c,bit-manipulation,putchar,C,Bit Manipulation,Putchar,有人知道1u在该功能中的作用吗? 下面的函数获取一个整数并输出其位。 我想弄清楚的那条线是putchar线。 我看到它以一个无符号整数作为参数,在一个二进制数大小的循环中迭代一个1或零,这正好发生在8*sizeof(int)上,并执行 表达式(1u上的“和”按位运算如下1u 1 1 0b0001 0b0010=>2 1 0b0001 0b0100=>4 1 0b0001 0b1000=>8 . . x值和ed是为了在右移时保留数字的符号。实际上,在我看来,这是为了说明符号扩展右移是如何进行的。

有人知道1u在该功能中的作用吗? 下面的函数获取一个整数并输出其位。 我想弄清楚的那条线是putchar线。 我看到它以一个无符号整数作为参数,在一个二进制数大小的循环中迭代一个1或零,这正好发生在8*sizeof(int)上,并执行
表达式(1u上的“和”按位运算如下
1u 1
1 0b0001 0b0010=>2
1 0b0001 0b0100=>4
1 0b0001 0b1000=>8
.
.

x
ed是为了在右移时保留数字的符号。实际上,在我看来,这是为了说明符号扩展右移是如何进行的。

代码打印了
x

这条线

for (int i = (sizeof(int) * 8) - 1; i >= 0; i--)
使
i
的值从“整数中的位数”-1到0

因此,如果我们假设int的大小为4(字符),那么代码可以这样编写:

for (int i = 31; i >= 0; i--)
因此,在这种情况下,循环可以展开如下:

putchar(x & (1u << 31) ? '1' : '0');
putchar(x & (1u << 30) ? '1' : '0');
putchar(x & (1u << 29) ? '1' : '0');
...
putchar(x & (1u <<  1) ? '1' : '0');
putchar(x & (1u <<  0) ? '1' : '0');
当使用
&
将此模式按位设置为
x
并将结果用作布尔值时,当
x
中的相应位为1时,它将生成true(如果为零,则为false)

因此,代码可以写成以下伪代码:

putchar(is_bit_31_in_x_set ? '1' : '0');
putchar(is_bit_30_in_x_set ? '1' : '0');
putchar(is_bit_29_in_x_set ? '1' : '0');
...
putchar(is_bit_1_in_x_set ? '1' : '0');
putchar(is_bit_0_in_x_set ? '1' : '0');

如果sizeof int不是4(如上所述)代码仍将打印二进制表示形式-仅使用另一个位数。例如,当sizeof int为2时,循环将从15下降到0。

哦,我现在明白了。因此,假设x是某个数字。它在二进制中的表示形式将基本上与二进制中的psuedo数进行比较,因为这个psuedo二进制从31开始LSB或(1u)的位非常有用的可视化。谢谢。这能回答您的问题吗?
putchar(x & (1u << 31) ? '1' : '0');
putchar(x & (1u << 30) ? '1' : '0');
putchar(x & (1u << 29) ? '1' : '0');
...
putchar(x & (1u <<  1) ? '1' : '0');
putchar(x & (1u <<  0) ? '1' : '0');
1000.0000.0000.0000.0000.0000.0000.0000  (i.e. 1u << 31)
0100.0000.0000.0000.0000.0000.0000.0000  (i.e. 1u << 30)
0010.0000.0000.0000.0000.0000.0000.0000  (i.e. 1u << 29)
...
0000.0000.0000.0000.0000.0000.0000.0010  (i.e. 1u << 1)
0000.0000.0000.0000.0000.0000.0000.0001  (i.e. 1u << 0)
putchar(is_bit_31_in_x_set ? '1' : '0');
putchar(is_bit_30_in_x_set ? '1' : '0');
putchar(is_bit_29_in_x_set ? '1' : '0');
...
putchar(is_bit_1_in_x_set ? '1' : '0');
putchar(is_bit_0_in_x_set ? '1' : '0');