一、加法

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. PLSQL Package包的使用

    创建包头 create or replace package pak_kingsql is procedure pro_kingsql(p_one in varchar2,p_two out varc ...

  2. Python开发【笔记】:关闭线程的方法

    1.通过API进行线程关闭 import threading import time import inspect import ctypes def _async_raise(tid, exctyp ...

  3. 基础邮件原理(MUA,MTA,MDA)

    电子邮件基本概念: MUA(Mail User Agent)接收邮件所使用的邮件客户端,使用IMAP或POP3协议与服务器通信: MTA(Mail Transfer Agent) 通过SMTP协议发送 ...

  4. Python之Pandas使用教程(转)

    https://blog.csdn.net/XiaoYi_Eric/article/details/79506660

  5. struts2 OGNL(Object-Graph Navigation Language) 井号,星号,百分号

    1.“#”主要有三种用途: 访问OGNL上下文和Action上下文,#相当于ActionContext.getContext():可以访问这几个ActionContext中的属性. parameter ...

  6. [原创]nginx添加module之threads

    一.安装nginx yum安装nginx 折叠源码 1 2 3 4 5 6 7 8 9 10 11 12 # 添加nginx源 rpm -ivh http://nginx.org/packages/c ...

  7. vcenter web client chrome浏览器打开中文显示乱码

    使用如下链接试试看https://x.x.x.x/vsphere-client/?locale=zh_CN&csp

  8. Java-使用IO流对大文件进行分割和分割后的合并

    有的时候我们想要操作的文件很大,比如:我们想要上传一个大文件,但是收到上传文件大小的限制,无法上传,这是我们可以将一个大的文件分割成若干个小文件进行操作,然后再把小文件还原成源文件.分割后的每个小文件 ...

  9. SP Flash Tool New Version v5.1352.01

    Friends, Sp Tool updated to new version with whole new revamped interface New SP Flash Tool 3.1352.0 ...

  10. python利用WMI监控windows状态如CPU、内存、硬盘

    安装pywin32库 下载地址: https://sourceforge.net/projects/pywin32/files%2Fpywin32/选择对应python版本的文件.下载后在window ...