C位运算中0x01和0x80代表什么?

Dan*_*abo 5 c bitwise-operators

我正在尝试反转C中的位顺序(作业问题,主题:按位运算符)。我找到了这种解决方案,但对使用的十六进制值(0x01和0x80)感到有些困惑。

  unsigned char reverse(unsigned char c) {
     int shift;
     unsigned char result = 0;

     for (shift = 0; shift < CHAR_BITS; shift++) {
        if (c & (0x01 << shift))
            result |= (0x80 >> shift);
     }
     return result;
  }
Run Code Online (Sandbox Code Playgroud)

我正在写的并没有讨论这些价值,所以我真的不确定它们是什么。有人可以阐明这个解决方案吗?谢谢!

Jon*_*ler 8

0x01 是最低有效位集,因此十进制值为 1。

0x80 是 8 位字节集的最高有效位。如果它存储在有符号字符中(在使用 2 的补码表示法的机器上 - 正如您可能遇到的大多数机器一样),它是最负的值(十进制 -128);在无符号字符中,它是十进制 +128。

另一个成为第二天性的模式是 0xFF,所有位都被设置;对于有符号字符,这是十进制 -1,对于无符号字符,这是十进制 -1。而且,当然,有 0x00 或零没有位设置。

循环在第一个周期所做的是检查是否设置了 LSB(最低有效位),如果是,则设置结果中的 MSB(最高有效位)。在下一个周期,它检查 LSB 的下一个并将下一个设置为 MSB,等等。

| MSB |     |     |     |     |     |     | LSB |
|  1  |  0  |  1  |  1  |  0  |  0  |  1  |  1  |   Input
|  1  |  1  |  0  |  0  |  1  |  1  |  0  |  1  |   Output
|  1  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |   0x80
|  0  |  0  |  0  |  0  |  0  |  0  |  0  |  1  |   0x01
|  0  |  1  |  0  |  0  |  0  |  0  |  0  |  0  |   (0x80 >> 1)
|  0  |  0  |  0  |  0  |  0  |  0  |  1  |  0  |   (0x01 << 1)
Run Code Online (Sandbox Code Playgroud)


Ste*_*hen 5

每个十六进制数字代表 4 位,所以

  • 0x01 只是一个很长的写 1 的方式。
  • 0x80 是二进制 [1000][0000] 或 128 的一种简短写入方式。

解决方案是使用按位运算符来测试和设置值。

表达方式:

if (a & b) { ... }
Run Code Online (Sandbox Code Playgroud)

如果 'a' 和 'b' 中的相同位为 1,则执行 '...'。

表达方式

c |= b
Run Code Online (Sandbox Code Playgroud)

将 'c' 中的位设置为 1,如果它们在 'b' 中为 1。

循环将测试和设置位向下移动。

祝你好运!