前言
  
  我们都知道,在计算机世界里,再复杂,再美的程序,到最后都会变成0与1。也就是我们常说的:二进制。二进制相信大家都很熟悉。与现实世界不同的是,在现实世界里,我们通常都是用十进制来表示的,也就是遇十进一,这些都是我们熟悉的。到这里,我们就会发现端倪,现实世界中的十进制与计算机中的二进制其计量单元是不一样的。那它们之间怎么转换呢?这就涉及到一些比较基础的计算机知识。不在本文中讨论(如果有兴趣,可以在下次讲讲)。嗯,回到今天的主题,来说说位运算,这又是一个怎样的概念呢?我们从小就开始接触,现实世界中的加减乘除这些运算,也就是十进制中的运算。今天我们要说的是:二进制位中的一些常用运算。例如:& (位与),| (位或) ,^(异或),<<(左移),>>(右移) 等等。
  
  真与假
  
  在进行运算符使用之前,我们有必要说下真假。在Java中,我们都知道,用 true 值表示真,false 值表示假。其实在计算机中,通常使用 1 表示真,0表示假。使用过Json的同学应该知道,Java中的boolean类型,用1也是可以反序列化成true,0反序列化为false的。
  
  & (位与)
  
  在说位与之前,我们先来说说我们熟悉的 && 逻辑与操作。简单来说: A&&B 也就是:A且B同时成立时为真,否则为假。也有人称之为:“一假必假”。
  
  现在我们再来看位与。首先,我们来看一段程序:
  
  @Test
  
  public void testBit(){
  
  int a = 8;
  
  int b = 9;
  
  System.out.println("a binary: "+Integer.toBinaryString(a));
  
  System.out.println("b binary: "+Integer.toBinaryString(b));
  
  System.out.println("a & b binary: "+Integer.toBinaryString(a&b));
  
  System.out.println("a & b result: "+(a&b));
  
  }
  
  再看解释之前,我们先猜猜结果是多少?
  
  代码解释:
  
  位与:我们从字面意思上来理解,也是二进制位的与操作。
  
  数字 8 的十进制是: 1000 。
  
  数字 9 的十进制是: 1001。
  
  我们再来进行位于操作:
  
  如下所示:
  
  8:1000
  
  9:1001
  
  &
  
  8 1000
  
  最左边的 1&1 = 1,中间的 0&0 = 0,最右边的0&1 = 0。
  
  二进制的结果为:1000,转换为10进制后为 8。
  
  程序运行结果如下:
  
  a binary: 1000
  
  b binary: 1001
  
  a & b binary: 1000
  
  a & b result: 8
  
  结果是符合预期的。
  
  | (位或)
  
  上面说 & (位与) 操作,现在我们来看看位或操作,继续使用上面的例子:如下所示:
  
  @Test
  
  public void testBit(){
  
  int a = 8;
  
  int b = 9;
  
  System.out.println("a binary: "+Integer.toBinaryString(a));
  
  System.out.println("b binary: "+Integer.toBinaryString(b));
  
  System.out.println("a & b binary: "+Integer.toBinaryString(a|b));
  
  System.out.println("a & b result: "+(a|b));
  
  }
  
  再看看二进制:
  
  8:1000
  
  9:1001
  
  |
  
  9 1001
  
  最左边的 1|1 = 1,中间的0|0 = 0 ,最右边的 0|1 = 1。
  
  结果二进制为: 1001 对应的10进制为 9。
  
  运算结果如下:
  
  a binary: 1000
  
  b binary: 1001
  
  a & b binary: 1001
  
  a & b result: 9
  
  ^(异或)
  
  这个运算符比较有意思,异从字面上来理解是:不同的。放在位操作里也是一样的。继续使用上面的例子:
  
  @Test
  
  public void testBit(){
  
  int a = 8;
  
  int b = 9;
  
  System.out.println("a binary: "+Integer.toBinaryString(a));
  
  System.out.println("b binary:www.michenggw.com "+Integer.toBinaryString(b));
  
  System.out.println("a & b binary: "+Integer.toBinaryString(a^b));
  
  System.out.println(www.fengshen157.com"a & b result: "+(a^b));
  
  }
  
  继续看二进制:
  
  8:1000
  
  9:1001
  
  ^
  
  1 0001
  
  位相同时取假,不同时取真。左边的 1=1 相同取假,也就是0。中间的0=0 也为假为0。最右边的0不等于1,为真。结果也就为1。
  
  <<(左移)
  
  在现实世界里,我们经常使用乘法。<< 则表示二进制中的位移操作,低位补0。例如:8<<1。
  
  @Test
  
  public void testCode(){
  
  int a =8;
  
  System.out.println(www.yongshiyule178.com"a toBinaryString: "+Integer.toBinaryString(a));
  
  System.out.println("a<<www.yongshi123.cn1 toBinaryString: "+Integer.toBinaryString(a<<1));
  
  System.out.println("result: "+(a<<1));
  
  二进制如下:
  
  8 1000
  
  8<<1
  
  16 10000
  
  结果为: 2^4 = 16。 << 左边 a 表示基数, 右边 1 则表示需要位移动的位数。 箭头指向哪边,则向哪边位移。程序运行结果:
  
  a toBiryString: 1000
  
  a<<1 toBinaryString: 10000
  
  result: 16
  
  >> 右移
  
  >>(右移) 与左移 << 则是相反的,高位补0 。继续上面的例子:
  
  @Test
  
  public void testCode(){
  
  int a =8;
  
  System.out.println(www.tiaotiaoylzc.com"a toBinaryString: "+Integer.toBinaryString(www.dfgjpt.com));
  
  System.out.println("1>>www.mhylpt.com a www.huayi157.com toBinaryString:www.myzx1.com "+Integer.toBinaryString(a>>1));
  
  System.out.println("result: "+(a>>1)
  
  }
  
  二进制:
  
  8 : 1000
  
  8>>1
  
  4 : 0100
  
  运行结果:
  
  a toBinaryString: 1000
  
  a>>1 toBinaryString: 100
  
  result: 4
  
  其实这里还有一个比较好记的口诀:
  
  a>>n 则表示: a / (2^n) 次方。 (取整)
  
  a<<n 则结果为: a * (2^n) 次方。
  
  现在我们来速算一下:
  
  当a = 13, n = 2 时。13<<2 等于 13* 4 = 52 。 13/4 = 3。
  
  (上述速算法,如有错误,欢迎打脸!!!)
  
  我们在源码以及常见算法中位移运算是非常常见的,一位Java程序员掌握位运算也是很有必要的。这对我们算法,源码理解都非常有帮助!

说说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. HTML 图片轮播制作工具

    下载地址:http://wowslider.com/download/wowslider-win-setup.zip?utm_source=free_downl_win&utm_medium= ...

  2. Luogu P3374 【模板】树状数组 1

    真正的模板题. 树状数组的思想很简单(不如说背代码更简单),每个节点记录多个节点的信息(每个点存x&(-x)个). 道理可以参见很多大佬的博客,最后前缀和的思想搞一下就好了.不想说也不会说. ...

  3. P4770 [NOI2018]你的名字

    蒟蒻表示不会sam凉凉了,所以只能提高SA技巧? 题意:有一个串\(A\),每次选择一个\(A\)的子串\(A'\),以及串\(B\),问\(B\)的所有本质不同子串中不在\(A'\)中的串的数量. ...

  4. Centos下添加静态路由(临时和永久有效)的操作记录

    公司IDC机房服务器上部署了一套外网LB环境,默认配置的是外网ip的路由地址,由于要和其他内网机器通信,所以需要配置内网ip的路由地址.整个操作过程,记录如下,以供以后参考学习: 1)内网网卡绑定 [ ...

  5. yum源使用的几个报错小总结 (例如: python2.6.6 下yum不能使用: No module named yum)

    服务器上的yum突然不好使用,使用yum时有如下几个保持,解决方案如下: 1)Error: Cannot retrieve repository metadata (repomd.xml) for r ...

  6. 《Linux内核设计与实现》读书笔记 4 进程调度

    第四章进程调度 进程调度程序可看做在可运行太进程之间分配有限的处理器时间资源的内核子系统.调度程序是多任务操作系统的基础.通过调度程序的合理调度,系统资源才能最大限度地发挥作用,多进程才会有并发执行的 ...

  7. Jquery画折线图、柱状图、饼图

    1.今天做了一个折线图,首先需要导js文件.这里有一个demo:http://files.cnblogs.com/files/feifeishi/jquery_zhexiantubingtuzhuzh ...

  8. Linux环境C程序设计

    Linux基础 常用shell命令 命令 说明 命令 说明 man 查看联机帮助 ls 查看目录及文件列表 cp 复制目录或文件 mv 移动目录或文件 cd 改变文件或目录 rm 删除文件或目录 mk ...

  9. Bash on Ubuntu on Windows 到底想干啥?apt update又能解决啥问题?

  10. windows的cmd下的find命令比bash(win10下的Ubuntu的bash)下的grep比较

    同样的一个catalina文件,windows的cmd下的find命令比bash下的grep要慢,windows确实占下风啊