在 C/C++/Obj-C 中将两个(或多个)数字的位表示压缩在一起的最佳方法是什么?
我有一到三个。它们的二进制表示是 [abc, ABC, xyz]。我想用二进制 [aAxbBycCz] 生成一个数字。我主要处理超过 21 位的数字。
(忽略整数、字节序等的限制)。
谢谢,节日快乐伙计们:)
应该适用于任意位数的解决方案:
const unsigned int BITS = 21;
unsigned int zipper(unsigned a0, unsigned a1, unsigned a2)
{
unsigned int result = 0;
for (unsigned int mask = 1<<BITS; mask != 0; mask >>= 1)
{
result |= a0 & mask;
result <<= 1;
result |= a1 & mask;
result <<= 1;
result |= a2 & mask;
}
return result;
}
如果您需要更高的速度,请进行一些预计算:
static unsigned explode[]= { 0, 1, 0x1000, 0x1001, 0x1000000, 0x1000001, 0x1001000, 0x1001001 } ;
unsigned int zipper(unsigned a0, unsigned a1, unsigned a2)
{
return explode[a0] | ( explode[a1] << 1) | ( explode[a2] << 2 ) ;
}
带有通常的越界警告等。
我会通过蛮力来做到这一点:
unsigned int binaryZip(unsigned int a0, unsigned int a1, unsigned int a2)
{
return ((a0 << 0) & 0x001) |
((a1 << 1) & 0x002) |
((a2 << 2) & 0x004) |
((a0 << 2) & 0x008) |
((a1 << 3) & 0x010) |
((a2 << 4) & 0x020) |
((a0 << 4) & 0x040) |
((a1 << 5) & 0x080) |
((a2 << 6) & 0x100);
}