zoukankan      html  css  js  c++  java
  • 位运算-实现加减乘除

    基本性质: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

  • 相关阅读:
    空间换时间之反范式设计之路/合理冗余/去除外键
    WebAPI接口设计:SwaggerUI文档 / 统一响应格式 / 统一异常处理 / 统一权限验证
    开放api接口签名验证
    EasyUI开发踩过的坑(EasyUI开发笔记)
    nuget挂了吗?
    C# 实体/集合差异比较,比较两个实体或集合值是否一样,将实体2的值动态赋值给实体1(名称一样的属性进行赋值)
    从应用的角度讲创业公司该如何选择域名?
    疑似easyui本身bug:easyui时间控件问题,试了几个版本都不行
    工作三年对程序的理解特来求证
    控制器读取视图表单中的数据的几种方式
  • 原文地址:https://www.cnblogs.com/mq0036/p/12153531.html
Copyright © 2011-2022 走看看