c - 解释数据表中的十六进制并使用 C 按位​​左移运算符进行转换

标签 c hex bit-manipulation

我正在阅读数据表,它说图像的大小可以由此确定:

Image Length = len 0 + Len 1 * 100h + Len 2 * 10000h

然后在单片机上实现的代码是

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

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

我想知道是否有人可以解释这里发生了什么?你如何从一个转到另一个?如果相关的话,单片机是 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);

关于c - 解释数据表中的十六进制并使用 C 按位​​左移运算符进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36083885/

相关文章:

c++ - strtok() - 为什么必须传递 NULL 指针才能获取字符串中的下一个标记?

python - Python 和 C 中的相同函数,不同的结果

c - 与 Node 和 Node-gyp 一起使用的 AWS Lambda 上出现奇怪的 "memory"行为

visual-studio - 使用 Visual Studio 的跟踪点以十六进制格式打印表达式结果

Flutter:将 RGB 值转换为十六进制 int

c - Tilde C 无符号整数与有符号整数

ios - 传递给不同类中的方法时,Objective-C NSArray 无法更改

c - 我不明白如何在 C 中将十六进制字符串转换为无符号字符?

c - 26 位无符号整数大数组

c - 为什么这种按位右移似乎不起作用?