两个bitset类型的数据的模2^n加法

本文详细解析了模2^n加法的概念及其在bitset数据类型上的实现方法,通过数学证明阐述了进位计算的原理,并提供了一个具体的C++程序示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两个bitset类型的数据进行模2^n加法

2n2^n2n加法即两个n位的二进制数相加,结果大于2n2^n2n,则丢掉溢出的进位,剩余的结果即为所求

思路

两位2进制数相加,使用如下公式:
sum=a⊕b⊕carriersum = a\oplus b \oplus carriersum=abcarrier
carrier=a&bcarrier = a\&bcarrier=a&b
只要循环计算两次,就不再有进位,即carrier结果即为0

证明

令 : X=xnxn−1xn−2...x1X=x_{n}x_{n-1}x_{n-2}...x_1X=xnxn1xn2...x1
Y=ynyn−1yn−2...y1Y = y_{n}y_{n-1}y_{n-2}...y_1Y=ynyn1yn2...y1
carrier=cncn−1cn−2...c1=X&Ycarrier = c_{n}c_{n-1}c_{n-2}...c_1= X \& Ycarrier=cncn1cn2...c1=X&Y
sum=a⊕b⊕carriersum = a\oplus b \oplus carriersum=abcarrier

对第 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=xixi1...x1=2i1 , subY=yiyi−1...y1=2i−1sub_Y=y_iy_{i-1}...y_1 = 2^{i -1}subY=yiyi1...y1=2i1

subX<=2i−1−1,subY<=2i−1−1sub_X <= 2^{i-1} - 1 , sub_Y <= 2^{i-1} - 1subX<=2i11,subY<=2i11,因此不可能有两次进位

程序如下,为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;

![在这里插入图片描述](https://img-blog.csdnimg.cn/20181208114506583.png

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值