令 : X=xnxn−1xn−2...x1 Y=ynyn−1yn−2...y1 carrier=cncn−1cn−2...c1=X&Y sum=a⊕b⊕carrier
对第 i bit进行分析,
ci=xi&yi ,若要ci 有两次进位,需要 subX=xixi−1...x1=2i−1 , subY=yiyi−1...y1=2i−1
但 subX<=2i−1−1,subY<=2i−1−1,因此不可能有两次进位
程序如下,为mod 23运算,可自行更改bitset的位数:
#include
#include
using namespace std;
bitset<3>& ModeTwoAdd(bitset<3>& a, bitset<3>& b)
{
bitset<3> c, c2, s;
//the first carrier
c = a & b;
s = a ^ b;
// the hightest carrier is neglected
c2 = c << 1;
c = s & c2;
s = s ^ c2;
// the hightest carrier is neglected
c2 = c << 1;
s = s ^ c2;
return s;
}
int main(int argc, char const *argv[])
{
bitset<3> a;
bitset<3> b;
bitset<3> sum;
a = 5;
b = 6;
// sum = a + b = 11 mod 8 = 3;
cout <<"a = "<< a << ", b = " << b << endl;
sum = ModeTwoAdd(a,b);
cout <<"sum = " << sum << endl;
}
结果:5+6 = 11 ,11 mod 8 = 3;