为什么我需要将二进制中的右移字符按位与 1 以获得正确的二进制值?

问题描述 投票:0回答:1

这是我正在做的练习:

作业名称:print_bits

预期文件:print_bits.c 允许的功能:写

编写一个接受一个字节的函数,并以二进制形式打印它而不用换行符 在最后。 您的函数必须声明如下:

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 的结果。为什么?

c while-loop bit-manipulation unsigned-char bitwise-and
1个回答
0
投票

右移操作用

>>
表示,不只是从左操作数中取出一位并进行移位。它移动左操作数的所有位。例如,假设 110110012 右移四位,则结果为 11012。如果您不将其与 1 相与,则结果为 13 (11012)。如果与 1 进行 AND 运算,结果为 1。

在使用 ASCII 的 C 实现中,字符“0”的代码为 48,如果将 13 添加到

'0'
,您将得到 61,即“=”的代码。

© www.soinside.com 2019 - 2024. All rights reserved.