从右往左,按位加,等于2则进位变成10
减法也是从右往左,0-1不够就向左边借1位
以下为示例代码,为方便计算,使用StringUtils.leftPad()前补0让两个操作数一样长:
import org.apache.commons.lang3.StringUtils;
public class BinaryOperation {
public static void main(String[] args) {
System.out.print("请输入两个二进制数的位数(n1 n2):");
String n12 = new Scanner(System.in).nextLine();
int n1 = Integer.parseInt(n12.split(" ")[0]);
int n2 = Integer.parseInt(n12.split(" ")[1]);
System.out.print("请输入第一个二进制数:");
String a = new Scanner(System.in).nextLine();
System.out.print("请输入第二个二进制数:");
String b = new Scanner(System.in).nextLine();
System.out.println("两数相加的结果为:" + addBinary(a, b));
System.out.println("两数相减的结果为:" + subBinary(a, b));
}
// 二进制加法
public static String addBinary(String a, String b) {
int len = Math.max(a.length(), b.length());
char[] r = new char[len]; // 实际结果可能比这个多一位,见循环后的判断
// 统一长度,方便使用同一下标进行计算
if (a.length() < len) a = StringUtils.leftPad(a, len, '0');
if (b.length() < len) b = StringUtils.leftPad(b, len, '0');
int i = len - 1;
int carry = 0;
while (i >= 0) {
int sum = (a.charAt(i) - '0') + (b.charAt(i) - '0') + carry;
if (sum >= 2) {
// 2进制,所以sum只可能是0,1,2,3,3为前面有进位
r[i] = (char) (sum % 2 + '0');
carry = 1;
} else {
r[i] = (char) (sum + '0');
carry = 0;
}
i--;
}
if (carry == 1) {
// 最后有进位,说明结果比r多一个1
return '1' + new String(r);
} else {
return new String(r);
}
}
// 二进制减法,不考虑负数(如考虑负数,先判断大小,然后交换位置,计算结果做补码转换)
public static String subBinary(String a, String b) {
int len = Math.max(a.length(), b.length());
char[] r = new char[len]; // 实际结果可能比这个少一位
// 统一长度,方便使用同一下标进行计算
if (a.length() < len) a = StringUtils.leftPad(a, len, '0');
if (b.length() < len) b = StringUtils.leftPad(b, len, '0');
int i = len - 1;
int borrow = 0;
while (i >= 0) {
int sum = (a.charAt(i) - '0') - (b.charAt(i) - '0') - borrow;
if (sum < 0) {
// 0-1=-1,之前有借位:1-1-1=-1,0-0-1=-1,0-1-1=-2
r[i] = (char) (sum + 2 + '0');
borrow = 1;
} else {
r[i] = (char) (sum + '0');
borrow = 0;
}
i--;
}
return new String(r);
}
}