我将从代码开始:
#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
任何人都可以向我解释我在想错的地方吗?
答案 0 :(得分:4)
比特移位4移位4个二进制数字,而不是2,因为你似乎正在显示。它也会移动1个十六进制数字。因此,如果你有0xAF,向左移动4会给你0xF0。因为它是char
,它只有8位而A被截断。右移4同样产生0xA。 0x0A | 0xF0 == 0xFA
。
答案 1 :(得分:3)
从基线开始,0xaf
为1010-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