Java位运算实现加减乘除
一、加法
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位运算实现加减乘除的更多相关文章
- Java位运算实现加减乘除四则运算
本文是继<一文了解有趣的位运算>的第二篇文章. 我们知道,计算机最基本的操作单元是字节(byte),一个字节由8个位(bit)组成,一个位只能存储一个0或1,其实也就是高低电平.无论多么复 ...
- 用Java位运算实现加减乘除四则运算
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6412875.html 感谢博客:http://blog.csdn.net/itismelzp/article/ ...
- Java位运算总结:位运算用途广泛《转》
前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...
- Java位运算总结:位运算用途广泛
前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...
- 我们必须要了解的Java位运算(不仅限于Java)
本文原创地址为 https://www.cnblogs.com/zh94/p/16195373.html 原创声明:作者:陈咬金. 博客地址:https://www.cnblogs.com/zh94/ ...
- Java 位运算2-LeetCode 201 Bitwise AND of Numbers Range
在Java位运算总结-leetcode题目博文中总结了Java提供的按位运算操作符,今天又碰到LeetCode中一道按位操作的题目 Given a range [m, n] where 0 <= ...
- Java位运算原理及使用讲解
前言日常开发中位运算不是很常用,但是巧妙的使用位运算可以大量减少运行开销,优化算法.举个例子,翻转操作比较常见,比如初始值为1,操作一次变为0,再操作一次变为1.可能的做法是使用三木运算符,判断原始值 ...
- (转)java位运算
转自:http://aijuans.iteye.com/blog/1850655 Java 位运算(移位.位与.或.异或.非) public class Test { public static ...
- Java 位运算超全面总结
1.原码.反码.补码 关于原码.反码.补码的相关知识作者不打算在这里长篇大论,相关知识已有别的大佬总结很好了,还请老铁自行 Google,不过有篇知乎回答是作者学编程以来见过对相关知识最通俗易懂,生动 ...
随机推荐
- android 量产软件改动信息(持续更新)
http://blog.csdn.net/xubin341719/article/details/8449352 关键词:android 4.0默认语言蓝牙名称 MTP名称默认时区关于平板电脑 内核版 ...
- SecTools.Org--bp
Burp Suite使用介绍(一) | WooYun知识库 http://drops.wooyun.org/tips/2227 我的渗透利器 | EVILCOS fr ...
- Implicit declaration of function 'BMKCoordinateForMapPoint' is invalid in C99
少一个头文件 #import <BaiduMapAPI_Utils/BMKGeometry.h> 加上这个就好了 <HPHalfScreenTopBar: 0x103570bb0; ...
- PL/SQL EXCEPTION捕获抛出异常
EXCEPTION抛出异常 处理除数为零异常 declare varA number; begin varA:=10/0; dbms_output.put_line('IT WILL NOT WORK ...
- 洛谷P3599 Koishi Loves Construction 构造
正解:构造 解题报告: 传送门! 这题俩问嘛,就分成两个问题港QwQ 就按顺序趴,先港第一问QwQ 首先要发现,n在膜n意义下就是0嘛 那作为前缀和的话显然它就只能放在第一个 然后再想下,发现,如果n ...
- SQL SERVER分区详解(1-5)
转自: (五)SQL Server分区自动化案例 (四)SQL Server分区管理 (三)索引分区知识详解 (二)SQL Server分区创建过程 (一)SQL Se ...
- golang 的精髓--pipeline流水线,对现实世界的完美模拟
https://blog.golang.org/pipelines https://www.cnblogs.com/junneyang/p/6215785.html 简介 Go语言的并发原语允许开发者 ...
- Python3之socket编程
一.socket的定义 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后 ...
- 让你分分钟了解Web接口测试
因为前后端架构分离技术的兴起,接口测试也越来越重要,最近一直想总结下,作为一个近三年的测试人员,接口这个词是耳濡目染的,而开发张口闭口也都是这个接口或那个接口怎么怎么样,自己遇到的bug也很多是接口问 ...
- EM算法小结
一.什么是EM算法? EM算法是机器学习中一个很重要的算法,即期望最大化算法,主要包括以下两个步骤: E步骤:estimate the expected values M步骤:re-estimate ...