一、加法

a+b

举例实现:13+9=22

13+9不考虑进位结果为12

只考虑进位结果为10

和刚好是22。

13二进制为1101,9二进制为1001。

不考虑进位结果为0100。算式为a^b

只考虑进位结果为10010。算式为(a&b)<< 1

然后它俩继续进行运算,直到进位为0。

算法实现:

 //两种方式:
//1、递归形式实现
int add(int a ,int b){
if (b == 0)
return a;
else{
//进位值
int carry = (a & b) << 1;
a = a ^b;
return add(a,carry);
}
} //非递归形式实现
int add2(int a ,int b){
//进位值
int carry;
while (b != 0){
carry = (a & b) << 1;
a = a ^b;
b = carry;
}
return a;
}

二、减法

a-b

先来证明一个等式。Java负数存储是以补码形式存储的(补码=反码+1)。所以反码=补码-1.即~n=-n-1=-(n+1)

所以a-b可以化简为a+(-b)=a+~b+1

算法实现:

 //减法实现 a+(-b)=a+~b+1
int subtraction(int a ,int b){
b = ~b+1;
return this.add(a,b);
}

三、乘法

a*b

举例说明:

  可以看到,二进制乘法的原理是:从乘数的低位到高位,遇到1并且这个1在乘数的右起第i(i从0开始数)位,那么就把被乘数左移i位得到 temp_i 。直到乘数中的1遍历完后,把根据各位1而得到的被乘数的左移值们 temp_i 相加起来即得乘法结果。那么根据这个原理,可以得到实现代码:这里要点为:用i记录当前遍历的乘数位,当前位为1则被乘数左移i位并加到和中,同时i++处理下一位;为0则乘数右移,i++,处理下一位......直到乘数==0说明乘数中的1遍历完了。此时把和返回即可。

算法实现:

 //乘法实现
//a 被乘数,b 乘数
int multiplication(int a,int b){
int i = 0;
int res = 0;
//乘数不为0
while (b != 0){
//处理当前位
//当前位是1
if ((b & 1) == 1){
res += (a << i);
b = b >> 1;
//记录当前是第几位
i++;
}else {
//当前位是0
b = b >> 1;
i++;
}
}
return res;
}

四、除法

a/b

除法的意义就在于:求a可以由多少个b组成。那么由此我们可得除法的实现:求a能减去多少个b,做减法的次数就是除法的商。

 //除法实现
int division(int a,int b){
int res;
if(a<b){
return 0;
}else{
res=division(subtraction(a, b), b)+1;
}
return res;
}

五、测试用例

 package bitOperation;

 /**
* @author zsh
* @company wlgzs
* @create 2019-02-15 9:46
* @Describe 位运算实现加减乘除操作
*/
public class Test {
//两种方式:
//1、递归形式实现
int add(int a ,int b){
if (b == 0)
return a;
else{
//进位值
int carry = (a & b) << 1;
a = a ^b;
return add(a,carry);
}
} //非递归形式实现
int add2(int a ,int b){
//进位值
int carry;
while (b != 0){
carry = (a & b) << 1;
a = a ^b;
b = carry;
}
return a;
} //减法实现 a+(-b)=a+~b+1
int subtraction(int a ,int b){
b = ~b+1;
return this.add(a,b);
} //乘法实现
//a 被乘数,b 乘数
int multiplication(int a,int b){
int i = 0;
int res = 0;
//乘数不为0
while (b != 0){
//处理当前位
//当前位是1
if ((b & 1) == 1){
res += (a << i);
b = b >> 1;
//记录当前是第几位
i++;
}else {
//当前位是0
b = b >> 1;
i++;
}
}
return res;
} //除法实现
int division(int a,int b){
int res;
if(a<b){
return 0;
}else{
res=division(subtraction(a, b), b)+1;
}
return res;
} public static void main(String[] args) {
System.out.println(new Test().add(100,8));
System.out.println(new Test().subtraction(100,8));
System.out.println(new Test().multiplication(-3,3));
System.out.println(new Test().division(100,3));
}
}

Java位运算实现加减乘除的更多相关文章

  1. Java位运算实现加减乘除四则运算

    本文是继<一文了解有趣的位运算>的第二篇文章. 我们知道,计算机最基本的操作单元是字节(byte),一个字节由8个位(bit)组成,一个位只能存储一个0或1,其实也就是高低电平.无论多么复 ...

  2. 用Java位运算实现加减乘除四则运算

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6412875.html 感谢博客:http://blog.csdn.net/itismelzp/article/ ...

  3. Java位运算总结:位运算用途广泛《转》

    前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...

  4. Java位运算总结:位运算用途广泛

    前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...

  5. 我们必须要了解的Java位运算(不仅限于Java)

    本文原创地址为 https://www.cnblogs.com/zh94/p/16195373.html 原创声明:作者:陈咬金. 博客地址:https://www.cnblogs.com/zh94/ ...

  6. Java 位运算2-LeetCode 201 Bitwise AND of Numbers Range

    在Java位运算总结-leetcode题目博文中总结了Java提供的按位运算操作符,今天又碰到LeetCode中一道按位操作的题目 Given a range [m, n] where 0 <= ...

  7. Java位运算原理及使用讲解

    前言日常开发中位运算不是很常用,但是巧妙的使用位运算可以大量减少运行开销,优化算法.举个例子,翻转操作比较常见,比如初始值为1,操作一次变为0,再操作一次变为1.可能的做法是使用三木运算符,判断原始值 ...

  8. (转)java位运算

    转自:http://aijuans.iteye.com/blog/1850655 Java 位运算(移位.位与.或.异或.非)   public class Test { public static ...

  9. Java 位运算超全面总结

    1.原码.反码.补码 关于原码.反码.补码的相关知识作者不打算在这里长篇大论,相关知识已有别的大佬总结很好了,还请老铁自行 Google,不过有篇知乎回答是作者学编程以来见过对相关知识最通俗易懂,生动 ...

随机推荐

  1. Centos7网桥配置

    CentOS 的网桥虽然配置了很多次,不过总是记不住那几条,还是简单记录下,增加网桥可以通过brctl命令,但是为了简便快捷,直接生成配置文件即可 1.在/etc/sysconfig/network- ...

  2. 新版微信小程序即将上线 新增微信支付功能

    <经济参考报>消息,新版微信小程序正在测试中,有可能将在近期正式上线.新版小程序增加了“附近门店”功能的接口,微信用户可以通过定位功能,查看提供线下服务的各类门店,并直接利用小程序实现包括 ...

  3. 你知道Windows和WordPress上帝模式吗?

    一.Windows 上帝模式 这个玩意出来很久很久了,估计不用多说,知道的同学还是挺多的,不知道的也只要百度一下,你就知道了. 方法很简单,在 Windows 系统任何地方新建一个文件夹,如下命名即可 ...

  4. Spark Sort-Based Shuffle具体实现内幕和源码详解

    为什么讲解Sorted-Based shuffle?2方面的原因:一,可能有些朋友看到Sorted-Based Shuffle的时候,会有一个误解,认为Spark基于Sorted-Based Shuf ...

  5. [py]戏说python面向对象细节

    面向对象圣经 认识面向对象 什么是面向对象? 有什么实在的好处? 被坑了这么多年,没弄清楚和面向过程有啥切身的区分 我以为这都是大学老师的错. 没把我们启蒙好. 这么多年深受其害. 总结起来三个字: ...

  6. 字母统计-map

    题目描述 输入一行字符串,计算其中A-Z大写字母出现的次数 输入描述: 案例可能有多组,每个案例输入为一行字符串. 输出描述: 对每个案例按A-Z的顺序输出其中大写字母出现的次数. 示例1 输入 复制 ...

  7. [LeetCode] 243. Shortest Word Distance_Easy

    Given a list of words and two words word1 and word2, return the shortest distance between these two ...

  8. 机器学习理论基础学习16---高斯网络(GN)

    一.高斯网络(高斯图模型)总体介绍 概率图模型分为三种:贝叶斯网络,马尔科夫随机场以及高斯网络:而高斯网络又可以根据有向无向细分为高斯贝叶斯网络和高斯马尔科夫随机场 二.高斯贝叶斯网络 1.高斯贝叶斯 ...

  9. unity3d-射线(Ray)

    射线Ray 射线是一个点向另外一个点发生的一条线,一旦与其他模型发生碰撞,他将停止发射.注意这条件是逻辑上的,界面上看不到. 一般使用射线判断是否发射至某个游戏对象上或者获得鼠标点击的游戏对象等. 用 ...

  10. jQuery Mobile 和 Kendo UI 的比较(转)

    jQuery Mobile 和 Kendo UI 的比较 转自 https://www.oschina.net/translate/jquery-mobile-versus-kendo-ui?cmp ...