题目主旨:求两个n位的二进制字符串逐位异或,并将其结果转换为十进制数字输出。
解题思路:两个字符串逐位获取并做异或运算,将异或结果保存成一个字符串,然后将前导0去掉,将剩余的0,1字符串使用Integer.valueOf("101010",2)方法转换为十进制数字输出。
package 京东;
import java.util.Scanner;
/**
* 题目描述 :异或运算是常见的二进制运算,给出两个n位二进制数a,b。a异或b的运算依次考虑二进制的每一位,若这一位相同,那么这一位的异或结果就是0,不同就是1。例如a=1100,b=0100。执行a异或b的运算,a的最高位是1,b的最高位是0,两个数字不同所以最高位异或结果是1;a和b次高位都是1,所以次高位异或为0;最后两位它们都是0,所以异或结果也都是0。那么a异或b的答案就是1000。现在输入两个n位二进制数,输出它们异或结果的十进制答案。上述样例中异或的二进制结果为1000,转化成十进制就是8。
*
* 输入 输入有三行,第一行一个数n(1<=n<=20),接下来两行有两个n位二进制数。输入的二进制数可能有前导零。
* 样例输入
* 4
* 1100
* 0100
* 样例输出8
*/
public class Q2017_异或 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int n = scanner.nextInt();
String str1 = scanner.next();
String str2 = scanner.next();
// 合法性判断
if (str1.length() != n || str2.length() != n) {
return;
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i < n; i++) {
int a = (int) str1.charAt(i);
int b = (int) str2.charAt(i);
int c = a ^ b;
sb.append(c);
}
int k = 0;// 标记第一次出现1的位置
for (int i = 0; i < n; i++) {
if (sb.charAt(i) == 0) {
continue;
} else {
k = i;
break;
}
}
if (k == n - 1 && k > 0) {// k>0的目的是为了防止输入的n==1时,如:输入0,1,则输出结果应该为1,而非0
System.out.println(0);
} else {
String string = sb.substring(k, sb.length());
// 将01字符串转为二进制时用Integer.valueOf("101010",2)
System.out.println(Integer.valueOf(string, 2));
}
}
}
}