这是我正在做的练习:
编写一个接受一个字节的函数,并以二进制形式打印它而不用换行符 在最后。 您的函数必须声明如下:
void print_bits(无符号字符八位字节);
例如,如果将 2 传递给 print_bits,它将打印“00000010”
////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////
这是一个解决方案:
#include <unistd.h>
void print_bits(unsigned char octet)
{
int i;
unsigned char bits;
i = 8;
while (i--)
{
bits = (octet >> i & 1) + '0';
write(1, &bits, 1);
}
}
我理解解决方案,除了一部分。如果我右移二进制形式的字符,为什么我需要与 1 执行按位与?会有什么不同呢?我应该得到相同的解决方案,因为我总是在 1 的最后一位使用 1 来执行操作。如果 unsigned char 中的位是 0,我将得到 0。如果它是 1,我将得到1. 但是,如果我尝试使用不使用按位与运算的示例来运行该程序,我会得到超出 0 和 1 的结果。为什么?
右移操作用
>>
表示,不只是从左操作数中取出一位并进行移位。它移动左操作数的所有位。例如,假设 110110012 右移四位,则结果为 11012。如果您不将其与 1 相与,则结果为 13 (11012)。如果与 1 进行 AND 运算,结果为 1。
在使用 ASCII 的 C 实现中,字符“0”的代码为 48,如果将 13 添加到
'0'
,您将得到 61,即“=”的代码。