[英]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);
將您的L0
, L1
和L2
視為兩位十六進制數XX
, YY
和ZZ
。
這里的情況是將它們組合在一起以組成六位數的十六進制數字:
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與十六進制示例中的0x10000
和0x100
非常相似嗎?
(考慮這些示例的另一種方式是,當您將L0
, L1
和L2
放在一起時,您正在使用以256為底的三位數,而當我將12、34和56放在一起時,則是以100為底。但是,如果您尚未准備好考慮100和256的基數,請不用擔心,您不必這樣做。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.