以下代码行向左移5位,即将3位MSB的底部3位
DWORD dwControlLocAddress2;
DWORD dwWriteDataWordAddress //Assume some initial value
dwControlLocAddress2 = ((dwWriteDataWordAddress & '\x07') * 32);
有人可以帮我理解吗?
答案 0 :(得分:5)
0x07
是二进制的00000111。因此,您正在屏蔽输入值并获得正确的三位。然后你乘以32即2 * 2 * 2 * 2 * 2 ......如果你考虑一下,向左移动1与乘以2相同。因此,向左移动五次是相同的乘以32。
答案 1 :(得分:3)
乘以2的幂 x 与左移 log 2 (x)相同:
x *= 2 -> x <<= 1
x *= 4 -> x <<= 2
.
.
.
x *= 32 -> x <<= 5
&
不进行移位 - 它只是屏蔽了底部的三位。您的示例中使用的语法有点奇怪 - 它使用的是十六进制字符文字'\x07'
,但它实际上与十六进制0x07
相同,后者又是二进制文件:
00000111
由于0
的任何位AND与[{1}}产生0
并且1
的任何位AND本身,因此示例中的&
操作只会给出底部的结果三位dwWriteDataWordAddress
。
答案 2 :(得分:1)
它有点迟钝但基本上你正在使用0x07
,然后乘以32
,这与5
的移位相同。我不确定为什么使用字符文字而不是整数文字,但可能是因为它表示为单个字节而不是单词。
等价物是:
( ( dw & 0x07 ) << 5 )
& 0x07
屏蔽前3位,<< 5
左移5位。
答案 3 :(得分:1)
& '\x07'
- 只有底部三位的掩码(十六进制7是二进制的111)
* 32
- 左移5(32是2 ^ 5)