![](/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.