一、Java中支持的位运算

  1. 位与(&):二元运算符,两个为1时结果为1,否则为0
  2. 位或(|):二元运算符,两个其中有一个为1时结果就为1,否则为0
  3. 位异或(^):二元运算符,两个数同时为1或0时结果为1,否则为0
  4. 位取非(~):一元运算符,取反操作
  5. 左移(<<):一元运算符,按位左移一定的位置。高位溢出,低位补零。
  6. 右移(>>):一元运算符,按位右移一定的位置。高位补零,低位溢出。
  7. 无符号右移(>>>):一元运算符,符号位(即最高位)保留,其它位置向右移动,高位补零,低位溢出。

二、位运算规则

  Java数值运算过程中都是先将十进制转换为二进制然后再进行运算,再把二进制数据转换为十进制展现给用户。二进制运算规则如下:

  对于有符号的而言,

  • 最高位为符号位,0表示正数,1表示负数
  • 正数的原码,反码和补码都一样,三码合一
  • 负数的反码:符号位保持不限,其他位取反
  • 负数的补码:补码 + 1
  • 0的反码和补码都是0
  • 计算机的运算的时候,都是将原码转成补码进行运算

  下面以 -1 为例子展示原码、反码和补码的转换关系(以int数据类型为例,int类型在Java中占4字节):

  

三、逻辑运算

(一)、与运算(&)

  一、运算规则

    两个数相同位置的比特进行与运算,若两个位置均为1,那么结果就为1,否者为0

  二、运算流程

  以 4 & -5 = 0为例子展示运算流程:

  1. 因为4为正数,所以原码和补码相同,即4的补码为:00000000 0000000 00000000 00000100

  2.因为-5为负数,所以需要进行原码 >>> 反码 >>> 补码的转换

    1)原码:10000000 00000000 00000000 00000101

    2)反码:11111111 11111111 11111111 11111010

    3)补码:11111111 11111111 11111111 11111011

  3.将4和-5的补码进行 & 运算:00000000 0000000 00000000 00000100

                  11111111 11111111 11111111 11111011         &

               00000000 00000000 00000000 00000000

  4.得到的补码结果为:00000000 00000000 00000000 00000000。所以结果为0

(二)、或运算(|)

  一、运算规则

    两个数相同位置的比特进行或运算,若其中一个为1则结果为1,否个结果为0。

  二、运算流程

  以 -2 | 5 = -1为例展示运算流程:

  1.-2为负数,需要进行原码 > 反码 > 补码的转换。转换步骤如下: 

    1)原码:10000000 00000000 00000000 00000010

    2)符号位不变,其他位置取反得反码:11111111 11111111 11111111 11111101

    3)在反码的基础上+1得到补码: 11111111 11111111 11111111 11111110

  2.5为正数,补码和反码一致,所以5的补码为:00000000 00000000 00000000 00000101

  3.将-2 和 5 的补码进行或运算: 11111111 11111111 11111111 11111110

               |    00000000 00000000 00000000 00000101

                  11111111 11111111 11111111 11111111

  4.根据上面的运算得到补码结果为:11111111 11111111 11111111 11111111

  5.结果显然是一个负数,而负数的补码和原码不一致,所以需要将补码结果转换为原码才能得到最终的结果

  6.补码转原码的过程是跟原码转补码相反的过程,具体过程如下:

    1)补码:11111111 11111111 11111111 11111111

    2)补码 -1 得到反码:11111111 11111111 11111111 11111110

    3)符号位不变,其他位置取反得:10000000 00000000 00000000 00000001

  7.最终得到的原码结果为 10000000 00000000 00000000 00000001,转成十进制为 -1

(三)、异或运算(^)

  一、运算规则

    两个数相同位置的比特进行或运算,若两个数均为0或1,则结果为0,否者为1.

  二、运算流程

    以 1 ^ -5 = 6 为例,具体运算流程如下:

    1.1的补码为:00000000 00000000 00000000 00000001

    2.-5的补码为:11111111 11111111 11111111 11111011(可参考与运算给出的流程)

    3.两个补码运算:  

          00000000 00000000 00000000 00000001

        ^     11111111   11111111   11111111    11111011

            11111111   11111111  11111111     11111010

    4.得到的补码结果为:11111111   11111111  11111111     11111010

    5.补码为负数,需要转换成原码:

      1)补码:11111111   11111111  11111111     11111010

      2)反码:11111111   11111111  11111111     11111001

      3)原码:10000000 00000000 00000000 000000110

    6.由原码:10000000 00000000 00000000 000000110,得出最终的时间结果为 -6.

(四)、取反运算(~)

  一、运算规则

    若位数为0,则取反后为1,若为1,取反后为0。

  二、运算规则

    以~2 = -3为例运算流程如下:

    1.2的原码为:00000000 00000000 00000000 00000010

    2.2的补码跟原码一致也为:00000000 00000000 00000000 00000010

    3.取反:111111111 11111111 11111111 11111101

    4.取反后的结果仍未补码,此时补码为负数,则需要转成原码

    5. 11111111 11111111 11111111 11111101 - 1 得到反码:11111111 11111111 11111111 11111100

    6. 11111111 11111111 11111111 11111100 符号位不变,其他位置取反得到原码为:10000000 00000000 00000000 00000011

    7.  10000000 00000000 00000000 00000011 转成十进制结果为 -3

          

四、位移操作

  (一)、左移(<<)

    规则:符号位不变,高位溢出截断,低位补零。比如 -1 << 2 = -4 (为方便讲解,图示的补码为-1)

  (二)、右移(>>)

    规则:符号位不变,低位溢出截断,高位用符号位填充。如:8 >> 2 = 2。

  (三)、无符号右移(>>>)

    规则:高位填充0,低位溢出。如-1>>>1=2147483647

Java 位运算总结的更多相关文章

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

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

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

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

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

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

  4. (转)java位运算

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

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

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

  6. Java 位运算超全面总结

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

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

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

  8. Java位运算经典实例

    一 源码.反码.补码 正数的源码.反码.补码相同,例如5:            5的源码:101            5的反码:101            5的补码:101 负数的源码.反码.补 ...

  9. Java 位运算(移位、位与、或、异或、非)

    Java提供的位运算符有:左移( << ).右移( >> ) .无符号右移( >>> ) .位与( & ) .位或( | ).位非( ~ ).位异或( ...

  10. java位运算

    Java的位运算(bitwise operators)直接对整数类型的位进行操作,这些整数类型包括long.int.short.char和 byte,位运算符具体如下表: 运算符 说明 << ...

随机推荐

  1. JavaScript的执行过程(深入执行上下文、GO、AO、VO和VE等概念)

    JavaScript的执行过程 前言 编写一段JavaScript代码,它是如何执行的呢?简单来说,JS引擎在执行JavaScript代码的过程中需要先解析再执行.那么在解析阶段JS引擎又会进行哪些操 ...

  2. 【爬虫】将 Scrapy 部署到 k8s

    一. 概述 因为学习了 docker 和 k8s ,不管什么项目都想使用容器化部署,一个最主要的原因是,使用容器化部署是真的方便.上一篇文章 [爬虫]从零开始使用 Scrapy 介绍了如何使用 scr ...

  3. 【Java】泛型

    文章目录 泛型 为什么要有泛型 在集合中使用泛型 如何自定义泛型结构 自定义泛型类.接口 泛型方法 泛型在继承方面的体现 通配符的使用 有限制条件的通配符的使用 泛型 为什么要有泛型 集合容器类在设计 ...

  4. java日志打印使用指南

    一.简介 日志打印是java代码开发中不可缺少的重要一步. 日志可以排查问题,可以搜集数据 二.常用日志框架 比较常用的日志框架就是logback, 一些老项目会使用log4j,他们用的都是slf4j ...

  5. Ubuntu16桌面版编译OpenCV4的java库和so库

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. Solon Web 开发,十四、与Spring、Jsr330的常用注解对比

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  7. SpringCloud之使用Zookeeper作为注册中心

    SpringCloud之使用Zookeeper作为注册中心 linux安装zookeeper 安装zookeeper 关闭linux防火墙 启动zookeeper 1 创建项目导入依赖和配置文件 &l ...

  8. qt之线程

    第一种创建: mythread1.h: #ifndef MYTHREAD_H #define MYTHREAD_H #include<QThread> #include<QDebug ...

  9. Android开发----RecyclerView视图的学习

    RecyclerView RecyclerView是什么? RecyclerView是如今Android开发中最常用的控件,其相较于ListView和GridView的功能更为强大,优化了两者的各种不 ...

  10. python组合

    目录 一:组合基础使用 二:组合 一:组合基础使用 组合: 就是一个对象拥有一个属性,该属性的值是另一个对象 继承:满足什么是什么的关系,is-a的关系 继承是一把双刃剑,单继承能实现就尽量少的继承, ...