以下代码行左移 5 位,即使底部 3 位成为 3 个 MSB
DWORD dwControlLocAddress2;
DWORD dwWriteDataWordAddress //Assume some initial value
dwControlLocAddress2 = ((dwWriteDataWordAddress & '\x07') * 32);
有人可以帮我理解如何吗?
以下代码行左移 5 位,即使底部 3 位成为 3 个 MSB
DWORD dwControlLocAddress2;
DWORD dwWriteDataWordAddress //Assume some initial value
dwControlLocAddress2 = ((dwWriteDataWordAddress & '\x07') * 32);
有人可以帮我理解如何吗?
二进制是00000111 0x07
。因此,您正在屏蔽输入值并获得正确的三位。然后你乘以 32,即 2 * 2 * 2 * 2 * 2... 如果你仔细想想,左移 1 与乘以 2 相同。所以,左移五次与乘以 32。
乘以两个x的幂与左移log 2 (x)相同:
x *= 2 -> x <<= 1
x *= 4 -> x <<= 2
.
.
.
x *= 32 -> x <<= 5
&
不做移位 - 它只是掩盖了底部的三位。您的示例中使用的语法有点奇怪-它使用十六进制字符文字'\x07'
,但这实际上与 hex 相同0x07
,而二进制又是:
00000111
由于与0
yield0
和任何位 AND 的任何位1
都是其本身,因此&
您示例中的操作仅给出一个结果,即dwWriteDataWordAddress
.
这有点迟钝,但本质上你是与0x07
然后乘以32
它与移位相同5
。我不确定为什么使用字符文字而不是整数文字,但也许它被表示为单个字节而不是单词。
相当于:
( ( dw & 0x07 ) << 5 )
& 0x07
屏蔽前 3 位并左移<< 5
5 位。
& '\x07'
- 仅低三位掩码(十六进制 7 为二进制 111)
* 32
- 左移 5 (32 是 2^5)