二进制数原码-反码和补码

一、下载Logisim数字逻辑仿真软件。

利用浏览器搜索相关资源

二、设计一个1bit半加器电路

1位半加器是一种数字电路,用于执行二进制加法它可以将两个输入位相加,并产生两个输出:和S和进位C。使用一个异或门产生S,一个与门产生C。
在1位半加器中,它只能处理一位输出,无法处理进位。

三、设计一个1bit全加器电路

1位全加器是一种数字电路,用于执行二进制加法。它与半加器不同之处在于,全加器可以处理来自前一位的进位(carry)。1位全加器接受三个输入:两个待相加的A和B,以及低位进位C。它产生两个输出:和S和进位C。

四、实现一个4位二进制数的补码器电路

补码原理如下:
(1)正数与原码相同;
(2) 负数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1。 同一个数字在不同的补码表示形式中是不同的。比如10进制数值-15的二进制原码是10001111,其补码在8位二进制中是11110001,然而在16位二进制补码表示中,不足位数要用符号位补全,也就是1111111111110001。

因为正数和负数的补码运算规则不一样,取决与输入二进制数的最高位(符号位)。从简单入手,可以先只考虑输入为负数情况的补码运算。补码运算中有一个加1运算,需要用全加器实现。 4位全加器可以用4个1位(bit)全加器级联得到。

输入为负数

输入为正数或负数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值