分析程序位移位

Analysing program bitshifting

我马上开始写代码:

#include <stdio.h>
int main()
{
  unsigned char value = 0xAF;
  printf("%02x\n", value);
  value = (value << 4) | (value >> 4);
  printf("%02x\n", value);
  return 0;
}

首先,我认为您不能将数字存储在字符中,您需要将其设为整数。显然不是。然后,如果我做了移位垫:

value << 4 = 101011110
value >> 4 =   1010111 

101011110
| 1010111
=101011111 

那就是 0x15f。 如果我编译该代码,它会打印

af
fa

谁能告诉我哪里错了?

位移位 4 移动 4 个二进制数字,而不是您显示的 2 个。它还移动 1 个十六进制数字。所以如果你有 0xAF,向左移动 4 就会得到 0xF0。因为是一个char,所以只有8位,把A截掉了。右移 4 位类似地产生 0xA。 0x0A | 0xF0 == 0xFA.

从基线开始,0xaf1010-1111<sub>16</sub>(我们假设一个八位char 这里基于代码,虽然它不是标准强制要求的。

表达式 value << 4 会将其左移 4 位(不是你想象的那样),得到 1010-1111- 0000<sub>16</sub> 是的,由于整数提升(<< 表达式的两个操作数都被提升,它超过了八位 char int 根据 ISO C11 6.5.7 以及标准的早期迭代)。

表达式 value >> 4 右移 四位,得到 1010<sub>16</sub>.

当你 bitwise-or 将它们放在一起时,你会得到:

1010-1111-0000
          1010
==============
1010-1111-1010

当你最终尝试将其改回八位 value 时,它会去掉高位,得到 1111-1010<sub>16</sub>,也就是0xFA.

您可能在计算中弄乱了位表示。

好的。我会尽量按照你提供的代码来解释。

值 0XAF = 10101111

值 << 4 = 11110000

值 >> 4 = 00001010

11110000 |00001010 = 11111010,因此是 0XFA。

说明: 1. 表示为二进制 8 位。 2. 当你 left/right 移动一个数字时,我认为你是在乘法和除法方面考虑它,但在 8 位二进制表示中它只是移动了 4 个位置并且这些位被 0 替换。

希望对您有所帮助。

因为sizeof(unsigned char)等于1.its一个8bit的数据。 "value"的范围是从0x0到0xFF,也就是有效位是从bit0到bit7。

所以当移位后将0x15F赋值给"value"时,只有bit 0到bit7的数据被赋值给变量"value",bit8被截断。

0x15f ---二值化---> 0001 0101 1111

变量"value"是一个8bit的数据,所以只给0101 1111赋值

值---二值化---> 0101 1111