如何添加四个整数,并与C/C ++添加一个添加

问题描述 投票:0回答:1
从我对thisAnswer

的读数中,可以使用一个添加和一些位操作来添加两个整数。我试图将此方法概括为添加四个8位整数。 uint32_t a, b; uint32_t c = a + b; uint32_t r = a ^ b ^ c; // calculate all carry uint32_t s = r & (0x01010100); // carry of only the digits that we care uint32_t sum = c - s; // undo the carry on these digits

该代码适用于大多数输入,但是有例外。例如,如果我设置
a = 0xfffeff00 // (-1,-2,-1, 0)
b = 0x01010100 // ( 1, 1, 1, 0)

预期的结果是
0x00ff0000
。它运行

c = 0x01000000 // ( 1, 0, 0, 0) r = 0xfffffe00 // (-1,-1,-2, 0) s = 0x01010000 // ( 1, 1, 0, 0) sum=0xffff0000 // (-1,-1, 0, 0)

sum
的前两个数字变为
ff

(代表

-1
),但正确的数字应为
0
。这是因为在减去
c = 01 00 00 00
s = 01 01 00 00
时,第二组的减法溢出并影响第一组的结果。
我想改善解决这个问题的最后一步,但无法找到一个很好的解决方案。
    
当你做的时候

uint32_t sum = c - 2;

可能会导致借口
c++ c simd
1个回答
0
投票
在您的代码中,从顶部字节借入到二阶字节中的借入。这将顶部字节从

-s

向下更改为
0x01010000

0x01000000

但也迫使二阶字节变为
0x01,从而使结果弄乱了。 更好的解决方案是toiterate the随身携带的步骤,直到没有新的不需要的跨字节携带。示例:

0x00

总体而言,这不仅仅是“一个添加”,这是一种迭代方法。但这是逻辑的直接扩展,如果您想完全留在算术算术上。
    
	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.