按位串起两个或多个数字

时间:2013-12-29 03:34:00

标签: c math binary

在C / C ++ / Obj-C中将两个(或更多)数字位表示压缩在一起的最佳方法是什么?

我有一到三个。他们的二进制表示是[abc,ABC,xyz]。我想用二进制[aAxbBycCz]生成一个数字。我主要使用超过21位的数字。

(忽略整数,endian-ness和诸如此类的限制)。

谢谢,节日快乐的家伙们:)

3 个答案:

答案 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);
}