个人主页:熬夜磕代码丶
作品专栏: java se
我变秃了,也变强了
给大家介绍一款程序员必备刷题平台——牛客网
点击注册一起刷题收获大厂offer吧

文章目录

  • 前言
  • 一、常见位运算
    • 1. &运算
    • 2. |运算
    • 3. ^运算
    • 4. ~运算
  • 二、位运算实现加法
  • 三、位运算实现减法
  • 四、位运算实现乘法
  • 四、位运算实现除法

前言

我们经常使用的加减乘除,我们所看到的只是表面的效果,那么加减乘除在底层究竟是怎么实现的?今天就让我们一探究竟.今天用位运算实现的加减乘除不使用任何的加减乘除符号.


一、常见位运算

1. &运算

&运算二进制每一位全1为1,否则为0

public static void main(String[] args) {int a = 1;int b = 3;System.out.println(a & b);}


2. |运算

|运算二进制每一位有1为1,全0为0

public static void main(String[] args) {int a = 1;int b = 3;System.out.println(a | b);}


3. ^运算

^运算二进制每一位不同为1,相同为0

public static void main(String[] args) {int a = 1;int b = 3;System.out.println(a ^ b);}


4. ~运算

~运算是二进制每一位按位取反.

public static void main(String[] args) {int a = 1;System.out.println(~a);}


二、位运算实现加法

public static void main(String[] args) {int a = 1;int b = 3;System.out.println(a + b);}


下来我们用位运算实现一下加法.

我们进行一次异或运算就相当于进行一次无进位加法,那这样也不能实现加法,那我们得想办法,实现进位的数值.

进行一次与运算,只有同时为1才为1,也当同时为1时,我们需要进位,所以我们进行与运算后进行左移一位的操作,即可得到进位后的数值.

我们对异或运算和与运算后左移一位的结果进行相加即可,但我们只能进行位运算,所以我们只能再次进行异或运算与与运算,直到云运算的结果为0时,我们的异或运算的结果即为加法的结果.

public static int bitAdd(int a,int b) {int sum = 0;while(b != 0) {sum = a ^ b;b = (a & b) << 1;a = sum;}return sum;}public static void main(String[] args) {System.out.println(bitAdd(1,2));}

三、位运算实现减法

public static void main(String[] args) {int a = 1;int b = 3;System.out.println(a - b);}


下来我们用位运算实现一下减法.
在我们有了位运算实现加法的基础之后,我们的减法就变得简单了,a - b == a + ( -b ),所以我们只需要将b变为-b即可实现减法功能,但我们不能使用负号,那我们来用位运算来实现一下.

public static void main(String[] args) {System.out.println(~3);}


我们可以发现一个数取反与相反数差一,我们取反加一即可得到相反数.

public static void main(String[] args) {System.out.println(~3 + 1);}

public static int bitAdd(int a,int b) {int sum = 0;while(b != 0) {sum = a ^ b;b = (a & b) << 1;a = sum;}return sum;}public static int bitSub(int a,int b) {return bitAdd(a,~b+1);}public static void main(String[] args) {System.out.println(bitSub(1,3));}

四、位运算实现乘法

public static void main(String[] args) {int a = 1;int b = 3;System.out.println(a * b);}


我们小学的时候是怎么进行乘法的,按位相乘,每一位和每一位相乘.

二进制中也是一样的,按位相乘,如果被乘数二进制位是1则与乘数相乘.每次运算进行移位

public static int bitAdd(int a,int b) {int sum = 0;while(b != 0) {sum = a ^ b;b = (a & b) << 1;a = sum;}return sum;}public static int bitMul(int a,int b) {int sum = 0;while(b != 0) {if((b & 1) != 0) {sum += a;}a <<= 1;b >>>= 1;}return sum;}public static void main(String[] args) {System.out.println(bitMul(1,3));}

四、位运算实现除法

public static void main(String[] args) {int a = 7;int b = 2;System.out.println(a / b);}


我们在用位运算实现除法时,采用逆推的方式,a / b = c,
a = c * b。


我们只需要求出a减去b向左的移位,只要满足a <= b的移位即可,每次移动多少位即a / b的结果二进制中某一位为1,以此循环倒推即可.


public static int bitAdd(int a,int b) {int sum = 0;while(b != 0) {sum = a ^ b;b = (a & b) << 1;a = sum;}return sum;}public static int negNum(int n) {//转化为相反数return bitAdd(~n,1);}public static int minus(int a,int b) {//实现两个数相减return bitAdd(a,negNum(b));}public static boolean isNeg(int n) {//判断是否为负数return n < 0;}public static int bitDiv(int a,int b) {int x = isNeg(a) ? negNum(a) : a;int y = isNeg(b) ? negNum(b) : b;int res = 0;for (int i = 30; i >= 0 ; i = minus(i,1)) {if((x >> i) >= y) {res |= (1 << i);x = minus(x,y << i);}}return isNeg(a) != isNeg(b) ? negNum(res) : res;}public static void main(String[] args) {int a = 7;int b = 2;System.out.println(bitDiv(a,b));}

java用位运算实现加减乘除相关推荐

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

    机器数和机器数的真值 一个数在计算机中的二进制表示形式,叫做这个数的机器数.机器数是带符号的,在计算机用机器数的最高位存放符号,正数为0,负数为1.举个例子,比如在机器字长为8位的情况下(机器字长是指 ...

  2. java加减_Java位运算实现加减乘除

    一.加法 a+b 举例实现:13+9=22 13+9不考虑进位结果为12 只考虑进位结果为10 和刚好是22. 13二进制为1101,9二进制为1001. 不考虑进位结果为0100.算式为a^b 只考 ...

  3. 只使用位运算实现加减乘除

    在线OJ: LeetCode 29. 两数相除 原题目的要求是不能使用乘法, 除法和取余运算符实现除法. 在本篇博客中把题目要求提高一点, 这里只使用位运算来实现, 顺便的也就把只使用位运算实现加减乘 ...

  4. java的位运算的意义

    最近,由于工作原因在编写教材时,对java的位运算进行了深入了解,现记录如下.       首先要明白一个概念,Java位运算是针对于整型数据类型的二进制进行的移位操作.主要包括位与.位或.位非,有符 ...

  5. C++学习笔记-----用位运算实现加减乘除

    C++学习笔记-----用位运算实现加减乘除 原文:http://blog.csdn.net/sinat_35261315/article/details/72904945 数据在计算机内存中是以二进 ...

  6. 【C++】位运算实现加减乘除

    1 #include<iostream> 2 #include<assert.h> 3 using namespace std; 4 5 // 位运算实现加减乘除 6 7 in ...

  7. 算法之美 | 位运算的巧妙奥秘(一) | JAVA中位运算的深入浅出

    文章目录 前言 一.位运算符号 二.位运算的运算规则 扩展 前言 传智杯初赛后有感而写,我目前阶段所学习的算法,只是最基础的数学,对于数字和数学公式还是不敏感,在小卡与质数2那道题,解题的思路只有最基 ...

  8. java int位运算_java中int的表示方法,位运算的解析

    随着时代的不断发展,越来越多的人开始投入到java的学习当中来.今天就来为大家介绍java中int的表示方法以及位运算的内容有哪些一起来看看吧. 首先我们需要知道的是,在java中,int是使用32位 ...

  9. 数学问题——位运算实现加减乘除

    ##位运算实现加减乘除 ###位运算实现加法 public static int add(int a, int b) {int sum = a;while (b != 0) {//不断的相加,直到没有 ...

最新文章

  1. php中文件操作函数,php中常用文件操作函数介绍
  2. JDBC常见面试题集锦(一)
  3. 网络加速和优化控制常用管理
  4. 如何判断设备是上电复位还是软复位(主动调用复位接口或者看门狗复位,W600)
  5. ubuntu 21.04 版本上 安装 sqlcmd
  6. vscode终端不识别python_VSCode无法识别我的已安装Python包
  7. Shell入门教程:算术运算
  8. R/3 ABAP开发学习笔记---网摘
  9. 数组排序-冒泡排序和选择排序
  10. 树莓派学习-I2c通信
  11. python设置代理_Python怎么设置代理
  12. 计算机时间单位,时间计算机单位之间的换算
  13. Photoshop2019 系统错误 无法启动此程序修复教程
  14. Python 爬虫---初窥门径
  15. 麦马计算机科学和麦马数学专业,积极配合 成功申请麦克马斯特大学数学专业...
  16. 计算机网络实验——交换机的基本配置与管理
  17. AutoCAD.Net二次开发 致命错误 “unhandled access violation reading xxx...”的处理经验
  18. 练习题 William's Colored Pencils
  19. echart 图表类型
  20. C语言总结 — 知识点导论图

热门文章

  1. 操作系统课程设计——进程调度模拟程序(JAVA语言实现)
  2. 3D打印机ender3-V2通过上位机以及下位机的安装并使用klipper的总体流程
  3. 触觉智能分享-Android ADB工具使用
  4. python实现隐函数曲率求解
  5. NCL 错误 fatal:Loop end must be scalar, can‘t execute loop
  6. 基于Springboot人力资源管理系统设计
  7. 镜像部署Windows环境
  8. 高校实验室设计SICOLAB高校实验室装修
  9. 0/0型极限等于多少_鹤岗钢制乙级防火门多少一平方_辽宁中安华泰防火门
  10. 本地生活服务APP开发