用位运算实现四则运算

原文地址:https://www.cnblogs.com/ygj0930/p/6412875.html

 1 /*这个代码主要用位运算实现四则运算*/
 2 public class FigureOut {
 3     public static void main(String[] args) {
 4         //用于测试我们自己的加法
 5         System.out.println(add(9999,5));
 6         //用于测试我们的减法
 7         System.out.println(minus(6,7));
 8         //用于测试乘法
 9         System.out.println(multi(66, 2));
10         //用于测试除法
11         System.out.println(sub(10,2));
12     }
13     
14     //加法的实现
15     public static int add(int a, int b) {
16         /*这里的原理是利用
17          * 1.a^b得到不进位的加法运算部分
18          * 2.a&b得到需要进位的部分
19          * 3.(a&b)<<1为需要进位的部分进位
20          * 4.总结起来为 a+b = a^b+(a&b)<<1
21          * 5.对于之间的加法我们会使用递归实现(实现加法怎能直接使用加法)
22          * */
23         //算法开始
24         //首先计算一下不进位的部分
25         int p1 = a^b;
26         //计算需要进位的部分
27         int p2 = (a&b)<<1;
28         if(p2!=0) {
29             return add(p1, p2);
30         }else {
31             return p1;
32         }
33     }
34     //减法的实现
35     public static int minus(int a, int b) {
36         /*这里运用的原理是将减法转换为加法
37          * 1.将减数变成一个负数
38          * 2.将另一个数与该负数相加
39          * 3.调用我们的加法来实现相加
40          * */
41         int p1 = ~(b-1);
42         return add(a,p1);
43     }
44     //乘法的实现
45     public static int multi(int a, int b) {
46         //定义一个int用于位数的记录
47         int i = 0;
48         //定义一个int用于最后结果的记录
49         int res = 0;
50         while(b!=0) {
51             //处理当前乘数位
52             /*首先判断当前为是否为1当是1时采取乘法的计算
53              * 为
54             否则直接进行下一位*/
55             if((b&1)==1) {
56                 res = add(res,a<<i);
57                 b=b>>1;//改变b的值
58                 i=add(i,1);//当前位处理完毕加一
59             }else {
60                 b=b>>1;
61                 i=add(i,1);
62             }
63         }
64         return res;
65     }
66     //实现除法
67     public static int sub(int a,int b) {
68         /*判断被除数里面有几个除数
69          * 这里利用的是减法
70          * 除法原理*/
71         int res = 0;//亲测初始值可以随意设定
72         if(a<b) {
73             return 0;
74         }else {
75             //这里使用了递归
76             res = add(sub(minus(a,b),b),1);
77         }
78         return res;
79     }
80     
81 }

这里的注释还算详细不做过多解释

posted @ 2018-06-06 15:47  升阳遗志  阅读(308)  评论(0编辑  收藏  举报