剑指offer里面有一道算法题,就是不用加减乘除去做加法。很明显就是要用位运算完成加法,所有运算在计算机底层都是由二进制完成的,所以不能用运算符,就只能用位运算了。
在Java里面,位运算对应运算符如下:
位运算 | 运算符 |
---|---|
与 | & |
或 | | |
异或 | ^ |
非 | ! |
左移位 | < |
右移位 | > |
在计算机底层中,数的运算是通过位运算完成的,而位运算的对象是二进制数。下面看一下二进制的加法是怎么一个过程:
十进制数:3 + 5
相当于二进制数:11+101
二进制运算也是一位一位地相加,如果两个数当前位都为1,则左边一位加上1。在看下面的变形,其实就是用位运算模拟进位过程,上面的数是原来的两个数的异或值,也就是不需要进位的那些位的值,下面的数是原来两个数的取与的值向左移一位,也就是进位后的值。那么一直重复这个操作,直到进位制为0,也就是没有进位啦,那么上面的数就是结果啦。
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int a = in.nextInt();
int b = in.nextInt();
while(a != 0) {
int temp = a & b < 1;
b = a ^ b;
a = temp;
}
System.out.println(b);
}
}