C语言 半加器与全加器 详解

温馨提示:此文章仅供个人学习使用,不得用作其他用途,转载请注明出处!

1. 半加器

最简单的加法电路是拿 2个bit 加在一起(bit是0或1) 有2个输入: A和B , 1个输出: 就是两个数字的和
需要注意的是 A、B 、输出 。这3个都是单个bit(0或1) **输出只有四种可能。前三个是: 0+0=0、 1+0=0、 0+1=1 ** 记住二进制里 ,1与true相同,0与false相同
这组输入和输出,和XOR门(异或门:相同为0,不同为1)的逻辑完全一样

在这里插入图片描述

但第四个输入组合,1+1,是个特例;1+1=2(显然),但进制里没有2,实际上,二进制1+1的结果是0, 1进到了下一位
XOR门的输出,只对了一部分,1+1输出0。 但我们需要额外的线代表“进位。” 只有输入是1和1时,进位才是“true”。因为算出来的结果用1个bit存不下,方便的是,我们刚好有个逻辑门能做这个事。 AND门,只有当两个输入都为“true”,输出才为“true”(“全1才1”);所以我们把它加到电路中,叫做“半加器”

在这里插入图片描述

把半加器封装成一个单独组件:

在这里插入图片描述

推荐学习视频: 10分钟速成课:计算机科学

如何理解逻辑门?点击链接查看:https://blog.csdn.net/weixin_43527871/article/details/97398886

如何计算二进制加法?点击链接查看:https://blog.csdn.net/weixin_43527871/article/details/97400100

2.全加器

如果想处理超过1+1的计算,我们需要“全加器”
半加器输出了进位,意味着我们计算下一列的时候,还有之后每一列,我们得加三个位在一起,并不是两个。 全加器复杂了一点点 有三个输入:A,B, C(都是一个bit)

在这里插入图片描述

所以最大可能是1+1+1, “总和”1 “进位”1 所以要两条输出线:“总和” 和 “进位”
我们可以用半加器做全加器 我们先用半加器将A和B相加 然后把C输入到第二个半加器 最后用一个 OR门 (或门:有1则1,全0才0) 检查进位是不是true 这样就做出了一个全加器

在这里插入图片描述

3. 代码实现:

#include<stdio.h>

int CARRY=0;
int SUM=0;
	
int AND(int A, int B);
int OR(int A, int B);
int XOR(int A, int B);

void HALF_ADDER(int A,int B);
void FULL_ADDER(int A,int B,int C);

int main(void)
{
	int A,B,C=0;
	int S;
	
	printf("请输入状态A与状态B: ");
	scanf("%d%d",&A,&B);
	
	S=AND(A,B);
	printf("\n执行 与门  A*B  操作为:");
	printf("%d",S);

	S=OR(A,B);
	printf("\n执行 或门  A+B  操作为:");
	printf("%d",S);
 
	HALF_ADDER(A,B);
	printf("\n半加器 执行 加法 操作 进位 为:");
	printf("%d",CARRY); 
	printf("\n半加器 执行 加法 操作 和 为:");
	printf("%d",SUM); 
	
	FULL_ADDER(A,B,C);
	printf("\n全加器 执行 加法 操作 进位 为:");
	printf("%d",CARRY); 
	printf("\n全加器 执行 加法 操作 和 为:");
	printf("%d",SUM);
	
	return 0;
}

/**/ 
int AND(int A, int B)//与门 
{
	int AandB;
	
	if(A*B==0)
	{
		AandB=0;
	}
	else
		AandB=1;
		
	return AandB;
}

int OR(int A, int B)//或门 
{
	int AorB;
	
	if(A+B==0)
	{
		AorB=0;
	}
	else
		AorB=1;
		
	return AorB;
}

int XOR(int A, int B)//异或门 
{
	int AxorB;
	
	if(A==B)
	{
		AxorB=0;
	}
	else
		AxorB=1;
		
	return AxorB;
}

void HALF_ADDER(int A,int B)//半加器 
{
	CARRY=AND(A,B);
	SUM=XOR(A,B);
}

void FULL_ADDER(int A,int B,int C)//全加器 
{
	int FULL_CARRY;
	HALF_ADDER(A,B);
	FULL_CARRY=CARRY;
	HALF_ADDER(SUM,C);
	CARRY=OR(FULL_CARRY,CARRY);
} 


/**/

  • 29
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值