有人知道 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/