字段打包字节返回意外结果

时间:2015-04-24 17:26:36

标签: objective-c c bit-manipulation bitwise-operators

根据我的上一个问题,我一直在尝试更改字段打包字节的某些位的值:Field packing to form a single byte

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

此代码正确记录: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

2 个答案:

答案 0 :(得分:4)

此值不是二进制。它是octal

uint8_t sizeOfGlobalColorTable = 010;

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

应该是:

uint8_t sizeOfGlobalColorTable = 0x2;

答案 1 :(得分:0)

C中的

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

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

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