c++ - 二进制加法从左到右进位

标签 c++ math bit-manipulation alu

如何有效地实现从左到右的 64 位二进制加法运算?就像翻转位然后添加:

0101 + 1110 = BitReverse(1010 + 0111)
            = BitReverse(10001)
            = 10001

我目前的解决方案是使用增量交换(也可能是字节交换内部函数)反转输入的位顺序,使用普通加法,然后再次反转,这不是特别快,但可能比循环 64 位整数更好. (我还没有测试过,但它仍然太慢了。)

uint64_t addreverse(uint64_t a, uint64_t b) {
    return BitReverse(BitReverse(a) + BitReverse(b));
}

这很慢,因为位需要反转 3 次,使用 byteswap 时需要 40 多次操作。

编辑:我不能将它们颠倒存储,因为我也需要定期添加。

最佳答案

模拟 Kogge-Stone adder , 移位方向相反,给出了一个很好的算法,

uint64_t p = x ^ y;
uint64_t g = x & y;

g |= p & (g >> 1);
p &= p >> 1;

g |= p & (g >> 2);
p &= p >> 2;

g |= p & (g >> 4);
p &= p >> 4;

g |= p & (g >> 8);
p &= p >> 8;

g |= p & (g >> 16);
p &= p >> 16;

g |= p & (g >> 32);

uint64_t result = x ^ y ^ (g >> 1);

关于c++ - 二进制加法从左到右进位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57572253/

相关文章:

c++ - 如何阻止客户端向服务器发送消息?

java - 使用 XOR 和加法对 int 求反

colors - 将8位颜色转换为RGB值

c# - 在位数组中拆分字节数组

c++ - 真等于1,假等于0吗?

c++ - 性能测量显示每个函数调用的 malloc 影响?

C++ 编程风格

python - 是否可以使用 solvePnP 找到 4 个角点的实际位置?

c++ - Gram-Schmidt 正交化不正确的实现

algorithm - 给定整数序列找到闭式函数的算法有哪些?