簡體   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