0

以下代码行左移 5 位,即使底部 3 位成为 3 个 MSB

 DWORD dwControlLocAddress2;
 DWORD dwWriteDataWordAddress //Assume some initial value
 dwControlLocAddress2 = ((dwWriteDataWordAddress & '\x07') * 32);

有人可以帮我理解如何吗?

4

4 回答 4

5

二进制是00000111 0x07。因此,您正在屏蔽输入值并获得正确的三位。然后你乘以 32,即 2 * 2 * 2 * 2 * 2... 如果你仔细想想,左移 1 与乘以 2 相同。所以,左移五次与乘以 32。

于 2013-05-03T15:00:37.137 回答
3

乘以两个x的幂与左移log 2 (x)相同:

  x *= 2   ->    x <<= 1
  x *= 4   ->    x <<= 2
     .
     .
     .
  x *= 32  ->    x <<= 5

&不做移位 - 它只是掩盖了底部的三位。您的示例中使用的语法有点奇怪-它使用十六进制字符文字'\x07',但这实际上与 hex 相同0x07,而二进制又是:

  00000111

由于与0yield0和任何位 AND 的任何位1都是其本身,因此&您示例中的操作仅给出一个结果,即dwWriteDataWordAddress.

于 2013-05-03T15:01:01.063 回答
1

这有点迟钝,但本质上你是与0x07然后乘以32它与移位相同5。我不确定为什么使用字符文字而不是整数文字,但也许它被表示为单个字节而不是单词。

相当于:

( ( dw & 0x07 ) << 5 )

& 0x07屏蔽前 3 位并左移<< 55 位。

于 2013-05-03T15:00:18.610 回答
1

& '\x07'- 仅低三位掩码(十六进制 7 为二进制 111)

* 32- 左移 5 (32 是 2^5)

于 2013-05-03T15:00:32.930 回答