簡體   English   中英

解釋數據表中的十六進制並使用C位左移運算符進行轉換

[英]Interpreting hex in a datasheet and converting using C bitwise left shift operators

我正在閱讀一個數據表,它說圖像的大小可以通過以下方式確定:

圖像長度= len 0 + Len 1 * 100h + Len 2 * 10000h

然后在MCU上實現此代碼是

L0 = Buffer[5];
L1 = Buffer[6];
L2 = Buffer[7];

image_size = L0 + (L1 << 8) + (L2 << 16);

我想知道是否有人可以解釋這里發生了什么? 您如何從一個轉到另一個? 如果相關,則MCU為32位。

100h表示十六進制的100,十進制的256。

將數字乘以256等於將其二進制表示形式向左移動8。

或更一般而言:將數字乘以2 ^ n相當於將其二進制表示形式向左移動n。 一個數字除以2 ^ n等效於將其二進制表示形式右移n個。

例:

        2  * 256 = 512
000000010 <<   8 = 100000000    // << is the shift left operator

所以實際上是這樣的:

image_size = L0 + (L1 << 8) + (L2 << 16);

可以寫成:

image_size = L0 + (L1 * 0x100) + (L2 * 0x10000);

0x前綴表示該數字以十六進制表示法而不是十進制表示法,因此我們還可以編寫:

image_size = L0 + (L1 * 256) + (L2 * 65536);

將您的L0L1L2視為兩位十六進制數XXYYZZ

這里的情況是將它們組合在一起以組成六位數的十六進制數字:

0xZZYYXX

因此,僅使用按位運算符將它們組合在一起的一種方法是(L2 << 16) | (L1 << 8) | L0 (L2 << 16) | (L1 << 8) | L0 (L2 << 16) | (L1 << 8) | L0 ,我們可以像這樣可視化:

L0    ZZ         =    000000XX
L1    YY << 8    =    0000YY00
L2    ZZ << 16   =    00ZZ0000
                      --------
       bitwise OR:  0x00ZZYYXX

但是正如邁克爾·沃爾茲(Michael Walz)解釋的那樣,向左移一位等於乘以2,向左移一位等於256乘以0x100。 此外,按位或非常接近加法,並且只要沒有溢出,按位或幾乎就是加法。 所以我們得到的結果與

(L2 * 0x10000) + (L1 * 0x100) + L0

如果仍然有困難,請考慮以10為基數而不是以16為基數。假設我想將數字12、34和56“放在一起”以獲得123456。我可以通過編寫

(12 * 10000) + (34 * 100) + 56

請注意,我使用的乘數10000和100與十六進制示例中的0x100000x100非常相似嗎?

(考慮這些示例的另一種方式是,當您將L0L1L2放在一起時,您正在使用以256為底的三位數,而當我將12、34和56放在一起時,則是以100為底。但是,如果您尚未准備好考慮100和256的基數,請不用擔心,您不必這樣做。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM