位运算-实现加减乘除

基本性质:1:~n=-(n+1),比如:~3=-4
        2:获取整数n的二进制串中最后一个1:-n&n=~(n-1)&n
        3:去掉整数n的二进制串中最后一个1:n&(n-1)

加法:(以下所有代码都是Java实现)

1
2
3
4
5
6
7
8
9
10
11
public static int add(int a,int b) {
      int res=a;
      int xor=a^b;  // a^b得到原位和(相当于按位相加没有进位)
      int forward=(a&b)<<1;//得到进位和   a&b:得到产生进位的地方 (a&b)<<1:进位后的值
      if(forward!=0){//若进位和不为0,则递归求原位和+进位和
          res=add(xor, forward);
      }else{
          res=xor;//若进位和为0,则此时原位和为所求和
      }
      return res;               
  }

减法:

1
2
3
4
public static int minus(int a,int b) {
      int B=~(b-1);  // 由上面基本性质   -b=+(-b),~(b-1)=-b  ===>>>  a-b=a+(-b)=a+(~(b-1)
      return add(a, B);       
  }

乘法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static  int multi(int a,int b){
      /*     1011
          *  1010
         --------
            10110 (1011<<1,相当于乘以0010)
          1011000 (1011<<3,相当于乘以1000)
          --------
          1101110
      */
      int i=0;
      int res=0;
      while(b!=0){//乘数为0则结束
          //处理乘数当前位
          if((b&1)==1){
              res+=(a<<i);
              b=b>>1;
              ++i;//i记录当前位是第几位
          }else{
              b=b>>1;
              ++i;
          }
      }
      return res;
  }

除法:

1
2
3
4
5
6
7
8
9
10
public static  int sub(int a,int b) {
      // 除法的意义就在于:求a可以由多少个b组成。那么由此我们可得除法的实现:求a能减去多少个b,做减法的次数就是除法的商。
      int res=-1;
      if(a<b){
          return 0;
      }else{
          res=sub(minus(a, b), b)+1;
      }
      return res;
  }

测试代码:

1
2
3
4
5
6
public static void main(String args[]){
      System.out.println("加法测试:"+add(10, 5));
      System.out.println("减法测试:"+minus(10, 5));
      System.out.println("乘法测试:"+multi(10, 5));
      System.out.println("除法测试:"+sub(10, 5));
  }

测试结果:

  

 

 

出处:https://www.cnblogs.com/xiaoyh/p/10251731.html

posted on   jack_Meng  阅读(863)  评论(0编辑  收藏  举报

编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
历史上的今天:
2016-01-05 汇编题目:在窗口上显示Welcome to masm!

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

支付宝打赏

主题色彩