C语言 按位将两个或多个数字压缩在一起



在 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);
}

相关内容

最新更新