繁体   English   中英

按位C-从无符号int解压缩有符号的10位数字

[英]Bitwise C - Unpacking signed 10 bit numbers from an unsigned int

我被要求创建一个函数,该函数将接受一个无符号的32位int并从该无符号的int中解压缩3个有符号的10位int。 此任务的上下文是一个解包函数,该函数使用32位无符号int作为输入和一个长度为3的数组xyz,并使用从原始int解包的x,y和z坐标来占用该数组,这些坐标是10位带符号的整数。

我编写了以下程序,该程序似乎对正值有效,但对负值无效。 我尝试打印输出坐标的十六进制值,以更好地理解基础二进制,对我来说一切似乎都很好,但是解释的数字出了错。 对于带符号的整数,编译器使用二进制补码来解释二进制。

void coordinates(unsigned int p, int xyz[3]) {
  unsigned int z = ((p << 22) >> 22) & 0x800003FF;
  xyz[0] = (~0 << 32) | (p >> 20) ;
  xyz[1] = (~0 << 32) | (p >> 10) & 0x3FF;
  xyz[2] = (~0 << 32) | z;
}

如果您还有其他问题,请告诉我,我们将尽力回答。

以下应该为您工作:

void coordinates(unsigned int p, int xyz[3])
{
    xyz[0] = (p >> 20) & 0x3FF; // Get 10 Bits
    if(xyz[0] & 0x200) // Check MSB
        xyz[0] |= 0xFFFFFC00; // Sign Extend
    xyz[1] = (p >> 10) & 0x3FF;
    if(xyz[1] & 0x200)
        xyz[1] |= 0xFFFFFC00;
    xyz[2] = p & 0x3FF;
    if(xyz[2] & 0x200)
        xyz[2] |= 0xFFFFFC00;
}

int main(void)
{
    int s10[3];
    unsigned int u32 = 0xFFFFFFFF;

    coordinates(u32, s10);
    printf("%08X %08X %08X %08X\n", u32, s10[0], s10[1], s10[2]);
    printf("%d %d %d %d\n", u32, s10[0], s10[1], s10[2]);

    u32 = 0x1FF7FDFF;

    coordinates(u32, s10);
    printf("%08X %08X %08X %08X\n", u32, s10[0], s10[1], s10[2]);
    printf("%d %d %d %d\n", u32, s10[0], s10[1], s10[2]);

    u32 = 0x20080200;

    coordinates(u32, s10);
    printf("%08X %08X %08X %08X\n", u32, s10[0], s10[1], s10[2]);
    printf("%d %d %d %d\n", u32, s10[0], s10[1], s10[2]);

    u32 = 0x00000000;

    coordinates(u32, s10);
    printf("%08X %08X %08X %08X\n", u32, s10[0], s10[1], s10[2]);
    printf("%d %d %d %d\n", u32, s10[0], s10[1], s10[2]);

    return 0;
}

产量

$ gcc main.c -o main.exe; ./main.exe;
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
-1 -1 -1 -1
1FF7FDFF 000001FF 000001FF 000001FF
536346111 511 511 511
20080200 FFFFFE00 FFFFFE00 FFFFFE00
537395712 -512 -512 -512
00000000 00000000 00000000 00000000
0 0 0 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM