本文主要写二进制相加
(<font color = 'gray'>二进制相加</font>)
二进制相加
二进制相加是一种特殊的加法运算,它只适用于二进制数。在计算机科学中,二进制相加被广泛应用于位运算、逻辑运算和数据存储等方面。 以下是二进制相加的一些作用:
- 位运算:二进制相加是位运算中的一种基本运算,它可以用于对二进制数进行位移、掩码操作等。例如,将一个数的各位向左移动一位,可以使用该数与2^n(其中n为向左移动的位数)进行按位异或运算。
- 逻辑运算:二进制相加还可以用于逻辑运算中。例如,当两个二进制数相同时,它们的和为0;当两个二进制数不同时,它们的和为1。因此,可以将二进制相加用于判断两个二进制数是否相同。
- 数据存储:在计算机中,二进制数据通常以二进制串的形式存储。二进制相加可以用于计算二进制串中的数值,从而实现对数据的读取和处理。
二进制相加的运算原理就是将俩个二进制数相加,得到一个新的二进制数。 俩个二进制数相加有四种情况:
- <font color="green">俩个数都为0 即 0+0 =0; </font>
- <font color="green">俩个数都为1 即 1+1 = 10;逢二进一
- <font color="green">俩个数一个为0一个为1 即0+1 =0 或 1+0 = 1;</font> 熟悉了原理就按照这个逻辑来写代码就可以了。 话不多说上代码
/**
* 二进制相加
* @Author @zzh
* @Description //TODO
* @Date 10:16 2023/5/4
* @param b1
* @param b2
* @return java.lang.String
**/
public static String add(String b1, String b2) {
int len1 = b1.length();
int len2 = b2.length();
String s1 = b1;
String s2 = b2;
StringBuffer sb1 = new StringBuffer();
//先将位数较少的二进制高位补零
if (len1 > len2) {
for (int i = 0; i < (len1 - len2); i++) {
sb1.append(0);
}
sb1.append(b2);
s1 = b1;
s2 = sb1.toString();
} else if (len1 < len2) {
for (int j = 0; j < (len2 - len1); j++) {
sb1.append(0);
}
sb1.append(b1);
s1 = sb1.toString();
s2 = b2;
}
//进位
int flag = 0;
StringBuffer sb2 = new StringBuffer();
for (int z = s1.length() - 1; z >= 0; z--) {
//字符’0’的对应的ASCII十进制是48
//分情况判断
if ((s1.charAt(z) - 48) == 0 && (s2.charAt(z) - 48) == 0) {
sb2.append(flag);
flag = 0;
continue;
}
if (((s1.charAt(z) - 48) == 0 && (s2.charAt(z) - 48) == 1 && flag == 0) || ((s1.charAt(z) - 48) == 1
&& (s2.charAt(z) - 48) == 0 && flag == 0)) {
sb2.append(1);
flag = 0;
continue;
}
if (((s1.charAt(z) - 48) == 0 && (s2.charAt(z) - 48) == 1 && flag == 1) || ((s1.charAt(z) - 48) == 1
&& (s2.charAt(z) - 48) == 0 && flag == 1)) {
sb2.append(0);
flag = 1;
continue;
}
if ((s1.charAt(z) - 48) == 1 && (s2.charAt(z) - 48) == 1 && flag == 0) {
sb2.append(0);
flag = 1;
continue;
}
if ((s1.charAt(z) - 48) == 1 && (s2.charAt(z) - 48) == 1 && flag == 1) {
sb2.append(1);
flag = 1;
}
}
if (flag == 1) {
sb2.append(flag);
}
//倒置
sb2.reverse();
return sb2.toString();
}
/**
* 二进制相加(测试结果精确度)
* @Author @zzh
* @Description //TODO
* @Date 14:23 2023/5/4
* @param a
* @param b
* @return java.lang.String
**/
public static String addBinary(String a, String b) {
int carry = 0; // 保存进位
int sum = 0; // 存储进位与两个位之间的和
int opa = 0;
int opb = 0;
StringBuilder res = new StringBuilder();
//将两个二进制数位补齐,在短的前面添0
while (a.length() != b.length()) {
if (a.length() > b.length()) {
b = "0" + b;
} else {
a = "0" + a;
}
}
//从后往前做加法
for (int i = a.length() - 1; i >= 0; i--) {
// String a 中的字符的ASCII码值与‘0’字符的差值
opa = a.charAt(i) - '0';
// String b 中的字符的ASCII码值与‘0’字符的差值
opb = b.charAt(i) - '0';
sum = opa + opb + carry;
if (sum >= 2) {
carry = 1;
res.append((sum - 2));
} else {
carry = 0;
res.append(sum);
}
}
if (carry == 1) {
res.append("1");
}
return res.reverse().toString();
}
标签:charAt,48,二进制,相加,算法,flag,&&,append
From: https://blog.51cto.com/u_16111319/6740685