二进制数原码-反码和补码的数字电路

一、加法器原理

在这里插入图片描述

这是两个4-bit二进制数相加,单独取出其中一个位数的数字相加过程,例如百位上,则为两个1-bit二进制数相加。这就是半加,即只求本位的和,暂时不管低位送进来的进位数。

1二进制加法原理

在这里插入图片描述
一个一位半加器由两部分组成:
(1)输入端口:A和B
(2)输出端口:S(和)、C(进位)。

以下为真值表:在这里插入图片描述

3、全加器

一个全加器由两个半加器组成。当多个位数相加,需要考虑进位,即cin。这就是全加。
在这里插入图片描述
全加器真值表:在这里插入图片描述

二、 制作一个四位二进制数的补码器

1、补码原理

1、正数的补码与原码相同
2、负数的补码,现将它的原码除符号位以外的所有位数取反,也就是0变成1,1变成0,首位符号位1不变,然后加1。

2、补码器制作

因为正数与负数的补码运算规则不一样,取决于输入二进制的最高位,也就是符号位。从简单入手,先只考虑输入情况为负数的情况。四位全加器需用四个一位全加器级联得到。
由于最高位都不变,所以当做三位数进行取反然后计算即可。
在这里插入图片描述
以下为计算结果表:
在这里插入图片描述

三、总结

要多加注重逻辑的学习以及梳理。厘清数字电路计算与普通数学计算的不同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
10进制转原码反码补码的方法如下: 1. 原码:将10进制的绝对值转换成二进制,然后在最高位上加上符号位(0表示正,1表示负)即可得到原码。 2. 反码:正反码原码相同,负反码是将其原码中除符号位以外的所有位取反。 3. 补码:正补码原码相同,负补码是将其反码加1。 C++代码实现: ```c++ #include <iostream> using namespace std; // 将10进制转换为二进制 void decToBin(int n, int bin[]) { int i = 0; while (n > 0) { bin[i++] = n % 2; n /= 2; } } // 将二进制转换为10进制 int binToDec(int bin[], int len) { int dec = 0; for (int i = len - 1; i >= 0; i--) { dec += bin[i] * pow(2, len - i - 1); } return dec; } // 将原码转换为反码 void oriToRev(int ori[], int len) { for (int i = 0; i < len; i++) { if (ori[i] == 1) { ori[i] = 0; } else { ori[i] = 1; } } } // 将反码转换为补码 void revToCom(int rev[], int len) { int carry = 1; for (int i = len - 1; i >= 0; i--) { if (rev[i] == 1 && carry == 1) { rev[i] = 0; } else if (rev[i] == 0 && carry == 1) { rev[i] = 1; carry = 0; } } } int main() { int n = -10; // 待转换的10进制 int len = 32; // 二进制的位 int bin[len] = {0}; // 存放二进制组 int ori[len] = {0}; // 存放原码组 int rev[len] = {0}; // 存放反码组 int com[len] = {0}; // 存放补码组 // 将10进制转换为二进制 decToBin(abs(n), bin); // 将二进制转换为原码 if (n >= 0) { ori[0] = 0; for (int i = 0; i < len - 1; i++) { ori[i + 1] = bin[i]; } } else { ori[0] = 1; for (int i = 0; i < len - 1; i++) { ori[i + 1] = bin[i]; } } // 将原码转换为反码 if (n < 0) { oriToRev(ori, len); } // 将反码转换为补码 if (n < 0) { revToCom(ori, len); } // 输出结果 cout << "原码:"; for (int i = 0; i < len; i++) { cout << ori[i]; } cout << endl; if (n < 0) { cout << "反码:"; for (int i = 0; i < len; i++) { cout << ori[i]; } cout << endl; cout << "补码:"; for (int i = 0; i < len; i++) { cout << com[i]; } cout << endl; } return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值