[英]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.