二进制用补码做加减法怎么实现,举个例子??
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为负).这就是机器数的原码了。
计算过程,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位二进制补码数后,我们就可能进行一些其他的操作了,比如布思算法、整数除法等。
以上是关于二进制用补码做加减法怎么实现,举个例子??的主要内容,如果未能解决你的问题,请参考以下文章