近日打算在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;