左移使用按位AND

时间:2013-05-03 14:57:38

标签: c

以下代码行向左移5位,即将3位MSB的底部3位

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

有人可以帮我理解吗?

4 个答案:

答案 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)