前两天看了b站上狂神的二进制计算教程

动手先写了个二进制加法计算器

通过String和List互转的方式

1
2
3
4
//String转List
Arrays.asList(str.split(""))
//List转String
String.join("", list)

基本实现二进制加法功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
* @ClassName: clacdemo
* @Date: 2020/7/7 0007 21:10
* @Description:
* @Author: <achao1441470436@gmail.com>
*/
public class clacdemo {

public static void main(String[] args) {
String four = "00000100";
String five = "00000101";
System.out.println(sum(four, five));
}

/**
* 加法
*
* @param num1
* @param num2
* @return
*/
public static String sum(String num1, String num2) {
List<String> list = new ArrayList<>();
//异或
list.add(xor(num1, num2));
//与
list.add(and(num1, num2));
//如果 与 结果为0
if (isZero(list.get(list.size() - 1))) {
//return 异或 的结果
return list.get(list.size() - 2);
}
//从第二步开始,重复计算
while (true) {
//进位
list.add(carry(list.get(list.size() - 1)));
//异或
list.add(xor(list.get(list.size() - 3), list.get(list.size() - 1)));
//与
list.add(and(list.get(list.size() - 4), list.get(list.size() - 2)));
//如果 与 结果为0
if (isZero(list.get(list.size() - 1))) {
//return 异或 的结果
return list.get(list.size() - 2);
}
}
}


/**
* 异或
*
* @param num1
* @param num2
* @return
*/
public static String xor(String num1, String num2) {
List<String> numList1 = Arrays.asList(num1.split(""));
List<String> numList2 = Arrays.asList(num2.split(""));
List<String> result = new ArrayList<>();
for (int i = 0; i < numList1.size(); i++) {
//异或 如果两者相等为0 不等为1
if (numList1.get(i).equals(numList2.get(i))) {
result.add("0");
} else {
result.add("1");
}
}
return String.join("", result);
}

/**
* 与
*
* @param num1
* @param num2
* @return
*/
public static String and(String num1, String num2) {
List<String> numList1 = Arrays.asList(num1.split(""));
List<String> numList2 = Arrays.asList(num2.split(""));
List<String> result = new ArrayList<>();
for (int i = 0; i < numList1.size(); i++) {
//与 两者为1 结果为1 否则为0
if ("1".equals(numList1.get(i)) && "1".equals(numList2.get(i))) {
result.add("1");
} else {
result.add("0");
}
}
return String.join("", result);
}

/**
* 判断是否全为0
*
* @param num
* @return
*/
public static Boolean isZero(String num) {
List<String> numList = Arrays.asList(num.split(""));
for (String tempNum : numList) {
//判断结果是否含1,有则return false
if ("1".equals(tempNum)) {
return false;
}
}
return true;
}

/**
* 进位
*
* @param num
* @return
*/
public static String carry(String num) {
List<String> numList = Arrays.asList(num.split(""));
for (int i = 0; i < numList.size(); i++) {
if ("1".equals(numList.get(i))) {
try {
numList.set(i - 1, "1");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("溢出!");
System.exit(0);
}
numList.set(i, "0");
}
}
return String.join("", numList);
}
}