/**
* 只使用位运算符实现两个整数的加减乘除功能
*/classSolution{publicstaticfinalintF=1<<31;// 符号位publicstaticfinalintH=1<<30;// 高位// 加法publicstaticintadd(int a,int b){if(b ==0){return a;}int sum = a ^ b;// 异或求和int carry =(a & b)<<1;// 进位returnadd(sum, carry);}// 减法publicstaticintsub(int a,int b){
b =add(~b,1);// 先反码,再补码returnadd(a, b);}// 绝对值privatestaticintabs(int n){if(n ==F){// 最小负数溢出thrownewRuntimeException("Numerical overflow");}if((n &F)==F){
n =sub(0, n);}return n;}// 大于等于privatestaticbooleangte(int a,int b){if(((a &F)^(b &F))==F){return(a &F)==0;}int m =H;while(m !=0){if((a & m)!=(b & m)){return(a & m)== m;}
m = m >>1;}returntrue;}// 乘法publicstaticintmul(int a,int b){boolean isMinus =((a &F)^(b &F))==F;
a =abs(a);
b =abs(b);int c =0;// 结果while(b !=0){if((b &1)==1){
c =add(a, c);}
a = a <<1;
b = b >>1;}if(isMinus){
c =sub(0, c);}return c;}// 除法publicstaticintdiv(int a,int b){if(b ==0){// 除数不能为零thrownewRuntimeException("Divide by zero");}boolean isMinus =((a &F)^(b &F))==F;
a =abs(a);
b =abs(b);int y =0;// 余数int c =0;// 结果int m =H;// 掩码while(m !=0){
y = y <<1;
c = c <<1;if((a & m)== m){
y = y |1;}if(y !=0){if(gte(y, b)){
y =sub(y, b);
c = c |1;}}
m = m >>1;}if(isMinus){
c =sub(0, c);}return c;}}
TestDemo 测试类
publicclassTestDemo{publicstaticvoidmain(String[] args){long time1 =System.currentTimeMillis();for(int i =0; i <1000_0000; i++){int a =randomInt(10000);int b =randomInt(1000);if(Solution.add(a, b)!= a + b){System.out.printf("%s + %s = %s (%s)%n", a, b,Solution.add(a, b), a + b);}if(Solution.sub(a, b)!= a - b){System.out.printf("%s - %s = %s (%s)%n", a, b,Solution.sub(a, b), a - b);}if(Solution.mul(a, b)!= a * b){System.out.printf("%s * %s = %s (%s)%n", a, b,Solution.mul(a, b), a * b);}if(b !=0&&Solution.div(a, b)!= a / b){System.out.printf("%s / %s = %s (%s)%n", a, b,Solution.div(a, b), a / b);}}long time2 =System.currentTimeMillis();System.out.printf("Running time %.2f seconds",(time2 - time1)/1000.0);}// 获取一个随机整数privatestaticintrandomInt(int m){int n =(int)(Math.random()* m);if(Math.random()<0.3){
n =-n;}return n;}// 展示32位比特信息publicstaticStringgetBit(int n){StringBuilder sb =newStringBuilder();for(int i =31; i >=0; i--){
sb.append(Math.abs((n &(1<< i))>> i));}return sb.toString();}}