[英]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.