字段打包字节 returns 意外结果
Field packing byte returns unexpected results
根据我的最后一个问题:
,我一直在尝试更改字段打包字节的某些位的值
但是,根据这些值,我得到了意想不到的结果。顶部代码示例为我提供了 0x91
的预期输出,但是如果我将 colorResolution
和 sizeOfGlobalColorTable
变量更改为: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。
根据我的最后一个问题:
但是,根据这些值,我得到了意想不到的结果。顶部代码示例为我提供了 0x91
的预期输出,但是如果我将 colorResolution
和 sizeOfGlobalColorTable
变量更改为: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。