【问题标题】:Field packing byte returns unexpected results字段打包字节返回意外结果
【发布时间】:2015-04-24 17:26:35
【问题描述】:

根据我的最后一个问题:Field packing to form a single byte

但是,根据这些值,我得到了意想不到的结果。顶部代码示例给了我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);

【问题讨论】:

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


    【解决方案1】:

    此值不是二进制。它是octal

    uint8_t sizeOfGlobalColorTable = 010;
    

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

    应该是:

    uint8_t sizeOfGlobalColorTable = 0x2;
    

    【讨论】:

    • 我不希望十六进制值作为输入,我想使用 0 或 1 作为我的标志。
    • @aviatorken89 据我在 Google 中看到的,Objective-C 中没有二进制文字,因此您必须处理它。至少使用十六进制会给你工作代码。
    • 或者我可以删除前导零,一切都会好起来的?如果这会产生有效字节,那对我来说很好。
    • @aviatorken89 如果删除前导零,值将是十进制。此外,如果您使用位,处理十六进制值会容易得多,因为每 4 位都是一个十六进制符号(例如,b11110xf)。
    • 我还是迷路了。如果我在上述问题示例中插入十六进制值而不是小数,则位移现在会弄乱输出值。
    【解决方案2】:

    C 中的 010 是八进制(以 8 为基数)表示十进制 8。

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

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

    【讨论】:

    • 那么对于带有前导零的标志,我可以安全地删除前导零吗?
    • 在您的代码中,001 与十进制 1 相同,因此您可以删除前导零。
    • 我想我刚刚理解了你的问题。如果您打算对数字/标志使用十六进制,请使用前导 0x,并且您不需要在十六进制值中使用前导零。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多