两个bitset类型的数据进行模2^n加法
模2n2^n2n加法即两个n位的二进制数相加,结果大于2n2^n2n,则丢掉溢出的进位,剩余的结果即为所求
思路
两位2进制数相加,使用如下公式:
sum=a⊕b⊕carriersum = a\oplus b \oplus carriersum=a⊕b⊕carrier
carrier=a&bcarrier = a\&bcarrier=a&b
只要循环计算两次,就不再有进位,即carrier结果即为0
证明
令 : X=xnxn−1xn−2...x1X=x_{n}x_{n-1}x_{n-2}...x_1X=xnxn−1xn−2...x1
Y=ynyn−1yn−2...y1Y = y_{n}y_{n-1}y_{n-2}...y_1Y=ynyn−1yn−2...y1
carrier=cncn−1cn−2...c1=X&Ycarrier = c_{n}c_{n-1}c_{n-2}...c_1= X \& Ycarrier=cncn−1cn−2...c1=X&Y
sum=a⊕b⊕carriersum = a\oplus b \oplus carriersum=a⊕b⊕carrier
对第 i bit进行分析,
ci=xi&yic_i=x_i\&y_ici=xi&yi ,若要ci 有两次进位,需要 subX=xixi−1...x1=2i−1sub_X=x_ix_{i-1}...x_1 = 2^{i-1}subX=xixi−1...x1=2i−1 , subY=yiyi−1...y1=2i−1sub_Y=y_iy_{i-1}...y_1 = 2^{i -1}subY=yiyi−1...y1=2i−1
但 subX<=2i−1−1,subY<=2i−1−1sub_X <= 2^{i-1} - 1 , sub_Y <= 2^{i-1} - 1subX<=2i−1−1,subY<=2i−1−1,因此不可能有两次进位
程序如下,为mod 23运算,可自行更改bitset的位数:
#include <iostream>
#include <bitset>
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;