繁体   English   中英

左移使用按位与

[英]Left shift using bitwise AND

以下代码行向左移动5位,即使低3位成为3个MSB

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

有人可以帮助我了解如何吗?

0x07为00000111二进制。 因此,您要屏蔽输入值并只获得正确的三位。 然后乘以32,即2 * 2 * 2 * 2 * 2 ...,如果考虑一下,向左移1等于乘以2。因此,向左移5次与乘以32。

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

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

&不会进行移位-只是掩盖了底部的三位。 您的示例中使用的语法'\\x07' -它使用的是十六进制字符文字'\\x07' ,但是在字面上与十六进制0x07相同,后者在二进制中是:

  00000111

由于任何与0进行AND运算的位都产生0而与1进行任何AND运算的位本身就是其本身,因此示例中的&操作简单地得出了dwWriteDataWordAddress三位的dwWriteDataWordAddress

有点钝,但实际上您是用0x07进行运算,然后乘以32 ,这与移位5相同。 我不确定为什么要使用字符文字而不是整数文字,但是也许不能将其表示为单个字节而不是单词。

等效为:

( ( dw & 0x07 ) << 5 )

& 0x07屏蔽掉前3位,而<< 5向左移5位。

& '\\x07'仅在底部三位屏蔽(十六进制7是二进制的111)

* 32向左移动5(32为2 ^ 5)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM