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)
我正在写的书并没有讨论这些价值,所以我真的不确定它们是什么。有人可以阐明这个解决方案吗?谢谢!
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)
每个十六进制数字代表 4 位,所以
解决方案是使用按位运算符来测试和设置值。
表达方式:
if (a & b) { ... }
Run Code Online (Sandbox Code Playgroud)
如果 'a' 和 'b' 中的相同位为 1,则执行 '...'。
表达方式
c |= b
Run Code Online (Sandbox Code Playgroud)
将 'c' 中的位设置为 1,如果它们在 'b' 中为 1。
循环将测试和设置位向下移动。
祝你好运!