字段打包字节 returns 意外结果

Field packing byte returns unexpected results

根据我的最后一个问题:

,我一直在尝试更改字段打包字节的某些位的值

但是,根据这些值,我得到了意想不到的结果。顶部代码示例为我提供了 0x91 的预期输出,但是如果我将 colorResolutionsizeOfGlobalColorTable 变量更改为:010,我将得到 0x80 的意外输出] 这不是它应该是什么的二进制表示:10100010 基于这里:http://www.best-microcontroller-projects.com/hex-code-table.html。我希望底部代码示例的输出为:0xA2。我缺少或不理解什么?

此代码正确记录:0x91

uint8_t screenDescriptorPackedFieldByte = 0;

uint8_t globalColorTableFlag = 1;
uint8_t colorResolution = 001;
uint8_t screenDescriptorSortFlag = 0;
uint8_t sizeOfGlobalColorTable = 001;

screenDescriptorPackedFieldByte |= ((globalColorTableFlag & 0x1) << 7);
screenDescriptorPackedFieldByte |= ((colorResolution & 0x7) << 4);
screenDescriptorPackedFieldByte |= ((screenDescriptorSortFlag & 0x1) << 3);
screenDescriptorPackedFieldByte |= ((sizeOfGlobalColorTable & 0x7) << 0);

NSLog(@"0x%02X",screenDescriptorPackedFieldByte);

此代码错误记录:0x80

uint8_t screenDescriptorPackedFieldByte = 0;

uint8_t globalColorTableFlag = 1;
uint8_t colorResolution = 010;
uint8_t screenDescriptorSortFlag = 0;
uint8_t sizeOfGlobalColorTable = 010;

screenDescriptorPackedFieldByte |= ((globalColorTableFlag & 0x1) << 7);
screenDescriptorPackedFieldByte |= ((colorResolution & 0x7) << 4);
screenDescriptorPackedFieldByte |= ((screenDescriptorSortFlag & 0x1) << 3);
screenDescriptorPackedFieldByte |= ((sizeOfGlobalColorTable & 0x7) << 0);

NSLog(@"0x%02X",screenDescriptorPackedFieldByte);

这个值是不是二进制的。是octal

uint8_t sizeOfGlobalColorTable = 010;

(Objective) C 中,从 0 开始的常量被解释为八进制值。你实际写的是b1000 & b0111 = 0.

应该是:

uint8_t sizeOfGlobalColorTable = 0x2;

C 中的 010 是十进制 8 的八进制(基数 8)。

前导 0 使编译器假定您需要一个八进制值,类似于使用 0x 前缀表示十六进制。

对于位计算的第 2 行和第 4 行,这将(正确地)产生 0 和 0。 您只想消除十进制 10 的 010 的前导 0,或者如果您想要二进制 010,则为 0x10。