近日打算在java中使用异或的位运算符来实现两个二进制数的相加,最后不会做上网找博客,最后也没找到,于是自己做出来之后就发布一篇关于它的博客,里面有两种做法,一种是不用异或,直接在主类用条件语句来实现;另一种是创建一个对象在自定义类中用异或等位运算符来实现。
闲话少说,上代码!
package javaoperation_1;
import java.util.*;
public class BinarySystem {
//private static final String number = null;
public static void main(String[] args) {
// TODO Auto-generated method stub
String std1,std2;
@SuppressWarnings("resource")
Scanner input = new Scanner(System.in);
System.out.print("请输入二进制数:");
std1 = input.nextLine();
System.out.print("请输入二进制数:");
std2 = input.nextLine();
System.out.println("二进制的和是: " + caculator(std1,std2));
}
public static String caculator(String std1,String std2) {
int number1 = 0; //存储第一个二进制的单个数值
int number2 = 0; //存储第二个二进制的单个数值
int add = 0; //存储两个二进制数数值相加后的进位数
int sum = 0; //存储同位数相加后的数
StringBuilder num = new StringBuilder();//创建一个可增删字符串变量num
//补全两个二进制数的位数 低位的在前面加字符串“0”
while(std1.length() != std2.length()) {
if(std1.length() > std2.length())
std2 = "0" + std2;
else
std1 = "0" + std1;
}
for(int j = std1.length() -1;j >=0;j --){
//字符串中的字符只有'1'和'0'
//按字符与ASCLL码之间的转换
//所得的x和y即为数值
number1 = std1.charAt(j) - '0';
number2 = std2.charAt(j) - '0';
sum = number1 +number2 + add;
if(sum >= 2){
add = 1;
num.append(sum - 2);
}
else {
add = 0;
num.append(sum);
}
}
if(add == 1)
num.append("1");
//以字符形式返还
return num.reverse().toString();
}
}
以上的是用条件语句来实现的,下面用位运算符来实现。
上代码之前先来了解一下下用到的几种位运算符:&(按位与)、|(按位或)、^(按位异或)
按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。
按位或运算符“|”是双目运算符。 其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1
按位异或运算符“^”是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。
二进制加法运算中当两个数都为1时,需进位1。下面上代码:
package javaoperation_1;
import java.util.*;
public class BinarySystem_1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String std1,std2;
Scanner input = new Scanner(System.in);
System.out.printf("请输入第一个二进制:");
std1 = input.nextLine();
System.out.printf("请输入第二个二进制:");
std2 = input.nextLine();
//创建一个add类的实例对象s
//把两个二进制字符串作为参数传到add类的构造函数中
add s = new add(std1,std2);
System.out.println(s.Operate());
}
}
class add{
String std1,std2;
StringBuilder str = new StringBuilder();//创建一个可增删的字符串对象变量str
//创建add类的构造函数
public add(String std1, String std2) {
this.std1 = std1;
this.std2 = std2;
}
//定义一个计算二进制数的方法
public String Operate() {
int number1 = 0;//存储第一个二进制的单个数值
int number2 = 0;//存储第二个二进制的单个数值
int number3 = 0;//存储两个二进制数数值经过逻辑运算后的进位数
int num=0; //存储同位数异或后的数
//补全两个二进制数的位数 低位的在前面加字符串“0”
while(std1.length() != std2.length()) {
if(std1.length() > std2.length())
std2 = "0" + std2;
else
std1 = "0" + std1;
}
for(int i = std1.length() - 1;i >= 0;i --) {
number1 = std1.charAt(i) - '0';
number2 = std2.charAt(i) - '0';
//使用异或来获取同位二进制数相加的数值
num = number1 ^ number2 ^ number3;
//使用按位运算符
//当有任何一组数为1且相同时进数则为1
number3 = (number1 & number2) | (number1 & number3) | (number2 & number3);
//if else 语句段也可实现上一条语句的功能
/*if(number1 ==1 & number2 ==1)
number3 = 1;
else
number3 = 0;*/
str.append(num);
}
if(number3 ==1)
str.append('1');
return str.reverse().toString();
}
}
下面也说一下这几种运算符的逻辑运算规则:
& 称为逻辑与,只有两个操作数都是true,结果才是true。
&& 称为简洁与或者短路与,也是只有两个操作数都是true,结果才是true。进行&&运算时,如果左边操作数为false,就不计算右边的表达式,直接得出false。类似于短路了右边。
| 称为逻辑或,只有两个操作数都是false,结果才是false。
|| 称为简洁或或者短路或,也是只有两个操作数都是false,结果才是false。但是如果左边操作数为true,就不计算右边的表达式,直接得出true。类似于短路了右边。这就称为短路。
而 &(逻辑与)和 |(逻辑或)则不会发生这种“短路”现象。下面代码中使用非“短路”的运算符。
^称为异或,异或的规则是把数转换成二进制比较,相同为0,不同为1。如:
1^1 = 0;
0^1 = 1;
1^0 = 1;
0^0 = 0;