分析程序位移位
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
.
从基线开始,0xaf
是 1010-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
我马上开始写代码:
#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
.
从基线开始,0xaf
是 1010-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