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实现)

      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;                
        }
    

    减法:

      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);        
        }
    

    乘法:

      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;
        }
    

    除法:

      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;
        }
    

    测试代码:

      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));
        }
    

    测试结果:

      

  • 相关阅读:
    工厂模式(Factory)(转)
    好东西要随时记录下来
    Windows Server 2003服务器清理C盘空间的资料多个解决方法
    phonegap 开发指南系列开始之前(1)
    phonegap 开发指南系列简介(2)
    VBS脚本完美实现开机延时启动
    需求分析师入门
    phonegap 开发指南系列(3) 在Eclipse中Android开发环境搭建
    Win 2003 服务器安全基本设置
    Linux命令行与图形界面切换方法
  • 原文地址:https://www.cnblogs.com/xiaoyh/p/10251731.html
Copyright © 2011-2022 走看看