分析程序位移

时间:2015-01-22 02:11:47

标签: c bit-shift

我将从代码开始:

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

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

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

101011110
| 1010111
=101011111 

那将是0x15f。 如果我编译该代码,则打印

af
fa

任何人都可以向我解释我在想错的地方吗?

4 个答案:

答案 0 :(得分:4)

比特移位4移位4个二进制数字,而不是2,因为你似乎正在显示。它也会移动1个十六进制数字。因此,如果你有0xAF,向左移动4会给你0xF0。因为它是char,它只有8位而A被截断。右移4同样产生0xA。 0x0A | 0xF0 == 0xFA

答案 1 :(得分:3)

从基线开始,0xaf1010-111116(我们在这里根据代码假设一个8位char,尽管它没有强制要求标准)。

表达式value << 4将左移四个位(而不是您认为的那个),给出1010-1111-000016,是的,它是&#39; s因整数提升而超过8位char<<表达式的两个操作数按照int提升为ISO C11 6.5.7,并且在标准的早期迭代中提升为value >> 4

表达式101016右移它四位,给出bitwise-or

当你1010-1111-0000 1010 ============== 1010-1111-1010 在一起时,你得到:

value

当你最终尝试将其重新插入到8位1111-101016时,它会使高位消失,得到0xFA,即{{1}}。

答案 2 :(得分:1)

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

确定。我将尝试根据您提供的代码进行解释。

值0XAF = 10101111

值&lt;&lt; 4 = 11110000

值&gt;&gt; 4 = 00001010

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

说明: 1.表示是二进制8位。 2.当您向左/右移动一个数字时,我认为您正在考虑乘法和除法,但在8位二进制表示中,它只会移位4位并且位被0替换。

希望这有帮助。

答案 3 :(得分:1)

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

所以当在位移后将0x15F分配给“值”时,只有位0到位7的数据被赋值给变量“value”,bit8被截断。

0x15f ---二值化---&gt; 0001 0101 1111

变量“value”是一个8位数据,因此只分配了 0101 1111

值---二值化---&gt; 0101 1111