![](/img/trans.png)
[英]Interpreting hex in a datasheet and converting using C bitwise left shift operators
[英]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.