在C / C ++ / Obj-C中将两个(或更多)数字位表示压缩在一起的最佳方法是什么?
我有一到三个。他们的二进制表示是[abc,ABC,xyz]。我想用二进制[aAxbBycCz]生成一个数字。我主要使用超过21位的数字。
(忽略整数,endian-ness和诸如此类的限制)。
谢谢,节日快乐的家伙们:)
答案 0 :(得分:2)
如果您需要更快的速度,请做一些预先计算:
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 ) ;
}
通常有关于越界的警告等等。
答案 1 :(得分:2)
一个适用于任意位数的解决方案:
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;
}
答案 2 :(得分:0)
我会用蛮力来做这件事:
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);
}