二进制用补码做加减法怎么实现,举个例子??

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二进制用补码做加减法怎么实现,举个例子??相关的知识,希望对你有一定的参考价值。

正数的补码是原码;负数的补码是符号位(最高位)不变,其余位按位取反加1.
用补码做减法运算时,结果出现的情况有正、0、负:
结果为正或者0时,补码是原码,直接转换成10进制即可;
结果为负时,需要将结果减1再保持符号位不变按位取反。
例如:1的原码是0000 0001,补码也是0000 0001
-2的原码是1000 0010,补码是1111 1110
1-2=1+(-2)=0000 0001 + 1111 1110 =1111 1111
此时1111 1111 是1-2结果的补码,转换成原码是1000 0001,对应的十进制是-1.
参考技术A

A-B =A+(-B) ,等于A的补码加(-B)的补码,而不是“A+(B的补码)”

    计算机只能识别0和1,使用的是二进制,而在日常生活中人们使用的是十进制,"正如亚里士多德早就指出的那样,今天十进制的广泛采用,只不过是我们绝大多数人生来具有10个手指头这个解剖学事实的结果。

    尽管在历史上手指计数(5,10进制)的实践要比二或三进制计数出现的晚。".为了能方便的与二进制转换,就使用了十六进制(2 4)和八进制1.数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了。

参考技术B 在计算机中:补码与原码的计算是同一套加法器,之所以有补码的原因之一就是为了省去再做一个减法器(当然还有省去-0使得负数能比正数多1,同时也是最大的负数10000…0),补码的运算直接算按照二进制加法计算就行,算出啥就是啥(还是补码)。
计算过程,a-b转化为 a+(-b)然后补码相加
具体原理,我不知道你是不是指的是补码的设计原理,补码的设计原理请谷歌,理解的话就想着计算机就一套加法器,这种东西会计算就行。
请给最佳
参考技术C 加法就不用转补码了,二进制减法a-b,可将-b转换为补码,再作加法处理。
补码=原码取反+1
参考技术D

X =-1.625,

Y =-5.25,

要求通过补码运算,求 X + Y、X-Y。

------------------

把数字都化为二进制,保留三位小数:

 X = -1.625 =  -1.101B。

 Y = -5.25 = -101.010B。


分别转换为八位补码:

 [X]补 = 1111 0011。

 [Y]补 = 1101 0110。

------------------

相加:

 [X + Y]补 = 1111 0011 + 1101 0110 = (1) 1100 1001。

舍弃进位只保留八位,(X + Y)的补码,就是 1100 1001。


再转为原码:

 [X + Y]原 = 1011 0111


求出对应的真值(记住:其中有三位小数):

 X + Y = -0110.111B = -6.875。

------------------

相减:

 [X - Y]补 = [X]补 + [-Y]补

      = 1111 0011 + 0010 1010

      = (1) 0001 1101。

舍弃进位只保留八位,(X - Y)的补码,就是 0001 1101。


再转为原码:

 [X - Y]原 = 0001 1101。


求出对应的真值(记住:其中有三位小数):

 X - Y = +0011.101B = +3.625。

------------------

任意N位二进制的补码实现——队列存放

    正在学习计算机组织与结构,为了写一些底层的算术操作模拟,比如一个二进制补码数的加减乘除,发现这很麻烦,因为不管是什么语言,都只提供了8位、32、64位等部分位数的补码形式,那么怎么实现任意任意位的补码整数呢,由于我们不能利用现有的如Byte、Integer类,所以我们需要一个容器来存储我们自己编写的任意位的补码整数。

   数组可以实现,但是数组移位可能比较麻烦,比如如果要实现二进制数的算术右移,必须要移动大部分元素。可以使用链表,虽然获取二进制数某一位的值比较麻烦,但是还是比数组可能更好一点。于是,我们采用基于链表的队列。

 

  2 
  3 /**
  4  * Created by XuTao on 2018/12/1 15:26
  5  * 作用:存储一个n位二进制数,并实现左右移动,取反等操作(补码形式)
  6  */
  7 public class BinaryQueue {
  8     private int size;
  9     private Node head = new Node(-1); //head只是一个头节点,后面才是二进制数,从左到右,从高位到低位的
 10     public BinaryQueue(int size){ //创建一个size大小的二进制,他被初始化为00...00
 11         this.size = size;
 12         Node temp =head;
 13         for (int i =0;i<size;i++){
 14             temp .next = new Node(0);
 15             temp = temp.next;
 16         }
 17     }
 18     public BinaryQueue(String binary){  //以二进制数创建
 19         this.size = binary.length();
 20         Node temp =head;
 21         for (int i =0;i<size;i++){
 22             temp .next = new Node(binary.charAt(i)-‘0‘);
 23             temp = temp.next;
 24         }
 25     }
 26     public void shiftLeft(){  //左移
 27         head.next = head.next.next;
 28         Node temp = head.next;
 29         for (int i=0;i<size;i++){
 30             if (i==size-2) {
 31                 temp.next = new Node(0);
 32                 break;
 33             }
 34             temp = temp.next;
 35         }
 36     }
 37     public void shiftRight(){//右移
 38         Node first = head.next;
 39         head.next = new Node(0);
 40         head.next.next=first;
 41 
 42         Node temp = head;
 43         for (int i =0;i<size;i++){
 44             temp = temp.next;
 45         }
 46         temp.next =null;
 47     }
 48     public void shiftRightArithmetically(){ //算术右移,符号扩展
 49         Node first = head.next;
 50         head.next = new Node(first.value);
 51         head.next.next=first;
 52 
 53         Node temp = head;
 54         for (int i =0;i<size;i++){
 55             temp = temp.next;
 56         }
 57         temp.next =null;
 58     }
 59 
 60     public void reverse(){
 61         Node temp = head.next;
 62         for (int i =0;i<size;i++){
 63             temp.value = 1-temp.value; //取反,是1,1-1=0;是0:1-0=1
 64             temp = temp.next;
 65         }
 66     }
 67 
 68     public BinaryQueue add(BinaryQueue bq){
 69         //将两个队列中的二进制放入数组中,如果长度不同则需要将短的进行算术扩展,
 70         int len = bq.size>size?bq.size:size;
 71         int [] arr_bq = new int[len];
 72         int [] arr_this = new int[len];
 73         if (bq.size>size){//bq 长,this扩展
 74             String s = bq.getStr();
 75             for (int i =0;i<len;i++){
 76                 arr_bq[i] = s.charAt(i)-‘0‘;
 77             }
 78             String s_this = getStr();
 79             for (int j =0 ;j<len;j++){
 80                 if (j<len-size){
 81                     arr_this[j] = head.next.value;
 82                 }
 83                 else {
 84                     arr_this[j]= s_this.charAt(j-(len-size))-‘0‘;
 85                 }
 86             }
 87         }
 88         else { //this 长 ,bq扩展
 89             String s = this.getStr();
 90             for (int i =0;i<len;i++){
 91                 arr_this[i] = s.charAt(i)-‘0‘;
 92             }
 93             String s_bq = bq.getStr();
 94             for (int j =0 ;j<len;j++){
 95                 if (j<len-size){
 96                     arr_bq[j] = bq.head.next.value;
 97                 }
 98                 else {
 99                     arr_bq[j]= s_bq.charAt(j-(len-size))-‘0‘;
100                 }
101             }
102         }
103 
104         //相加
105         int []res = new int[len];
106         int carry = 0; //上一次加的进位
107         for (int i = len-1;i>=0;i--){
108             res[i] = arr_bq[i]+arr_this[i]+carry;
109             if (res[i]==2){//进位1,本位0
110                 res[i]=0;
111                 carry =1;
112             }
113             else if (res[i]==3){//进位1,本位1
114                 res[i]=1;
115                 carry =1;
116             }
117             else carry = 0;
118         }
119         String str = "";
120         for (int i =0;i<len;i++){
121             str+=res[i];
122         }
123         return new BinaryQueue(str);
124     }
125 
126     public BinaryQueue getOppositeNumber(){//取相反数,就是取反加一
127         String s = "";
128         for (int i=0;i<size-1;i++){
129             s+="0";
130         }
131         s+="1";
132         reverse();//取反
133         return add(new BinaryQueue(s));//加一
134     }
135 
136     public int getInt(){ //获取二进制所代表的补码整数
137         if (head.next.value==1){
138             return -Integer.valueOf(getOppositeNumber().getStr(),2);
139         }
140         return Integer.valueOf(getStr(),2);
141     }
142 
143 
144     public String getStr(){//获取二进制的字符串形式
145         String str ="";
146         Node temp = head.next;
147         while (temp!=null){
148             str+=temp.value;
149             temp =temp.next;
150         }
151         return str;
152     }
153 
154     public static void main(String[] args) {
155         BinaryQueue bq = new  BinaryQueue("1100000011");
156         BinaryQueue bq2 = new BinaryQueue("0000000000");
157 //        System.out.println(bq.add(bq2).getStr());
158 //        System.out.println(bq2.getOppositeNumber().getStr());
159         System.out.println(bq.getInt());
160         System.out.println(bq2.getInt());
161     }
162 
163     //节点类
164     class Node{
165         int value;
166         Node next;
167         Node (int value){
168             this.value = value;
169         }
170     }
171 }

有了我们自己定义的任意N位二进制补码数后,我们就可能进行一些其他的操作了,比如布思算法、整数除法等。

 



以上是关于二进制用补码做加减法怎么实现,举个例子??的主要内容,如果未能解决你的问题,请参考以下文章

java加减的二进制实现

原码反码补码

如何用adc的芯片来强化学习——二进制的补码

在定点二进制运算器中,减法运算一般通过什么来实现

二进制的原码、补码、反码详解

如何理解二进制原码,反码,补码,二进制补码运算