根据我的上一个问题,我一直在尝试更改字段打包字节的某些位的值:Field packing to form a single byte
但是,我根据这些值得到了意想不到的结果。顶部代码示例为我提供了0x91
的预期输出,但如果我将colorResolution
和sizeOfGlobalColorTable
变量更改为: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
答案 0 :(得分:4)
此值不是二进制。它是octal。
uint8_t sizeOfGlobalColorTable = 010;
在(Objective) C
中,从0
开始的常量被解释为八进制值。你实际写的是b1000 & b0111 = 0
。
应该是:
uint8_t sizeOfGlobalColorTable = 0x2;
答案 1 :(得分:0)
010是十进制8的八进制(基数为8)。
前导0使编译器假设您需要八进制值,类似于使用0x前缀来表示十六进制。
这将(正确地)导致位计算的第2行和第4行的0和0。 您想要消除十进制10的010的前导0,或者如果您想要二进制010,0x10。