有人可以向我解释一下这个按位函数中的 putchar 行吗?

标签 c bit-manipulation putchar

有人知道 1u 在这个函数中的作用吗? 以下函数接受一个整数并打印出它的位。 我试图弄清楚的线是 putchar 线。 我看到它需要一个无符号整数作为参数,并在二进制数大小的循环中迭代 1 或 0,这恰好发生在 8*sizeof(int) 上并执行 表达式上的“与”按位运算 (1u << i) 其中 i 只是决定有多少个循环的迭代 要移位的位。 1u 中的 u 只是一个修饰符来声明数字无符号还是其他什么? 我试图准确理解此函数中的 putchar 行如何用该行显示 x 的每一位。

它是&位运算 因此,如果 x 中的位和 (1u << i ) 中的位均为 1,则循环将字符置为 1,否则置为 0。 但由于我不太明白 1u 是什么,所以我真的不知道将 i 向左移动位会做什么 打印出 x 的位。

有人可以用通俗易懂的方式帮我解释一下吗?

void showbits( unsigned int x )
{
    for (int i = (sizeof(int) * 8) - 1; i >= 0; i--)
    {
        putchar(x & (1u << i) ? '1' : '0');
    }
    printf("\n");
}

最佳答案

该代码打印 x 的二进制表示形式

这一行

for (int i = (sizeof(int) * 8) - 1; i >= 0; i--)

使i值从“number_of_bits_in_an_int”- 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');

(1u << ..)然后可以计算部分。 1u是一个无符号整型,值为 1,左移多次。它产生从 MSB 开始的步行 1 位模式。喜欢:

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)

当该模式按位与运算为 x 时使用&结果作为 bool 值,当 x 中的相应位时将生成 true为 1(如果为零则为 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');

如果 int 的 sizeof 不是 4(如上面假设的那样),代码仍将打印二进制表示形式 - 只是使用其他位数。例如,sizeof int 为 2,循环将从 15 下降到 0。

关于有人可以向我解释一下这个按位函数中的 putchar 行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58552738/

相关文章:

c - 我有两个与 getchar() 和 putchar() 有关的问题

c - 为什么以这种方式声明函数参数: void func(x) int x; {}

c - C中的循环。程序中的第一个循环不起作用并且是无限的

c - 按位运算符如何节省内存空间?

c++ - C 和 C++ 编码标准

python - 为什么不能在 python 中异或字节对象?

python - 按地址范围切片十六进制字符串

c - post和pre递减c函数putchar中的char指针值的区别

c - pthread_barrier_wait 返回后,如何立即销毁屏障?

c - 如何使用 gcc 将变量传递给 C 程序