前言
  
  我们都知道,在计算机世界里,再复杂,再美的程序,到最后都会变成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. 安全提示:IIS不要开启“WebDAV”扩展(转载)

    在IIS设置里,有一个“Web服务扩展”的设置,其中包括“WebDAV”扩展.许多人都不明白,这个“WebDAV”扩展是干嘛用的,要不要开启呢?有不少人的想法是“开启吧,以免影响网站运行,启用总比不启 ...

  2. mybatis源码-解析配置文件(四)之配置文件Mapper解析

    在 mybatis源码-解析配置文件(三)之配置文件Configuration解析 中, 讲解了 Configuration 是如何解析的. 其中, mappers作为configuration节点的 ...

  3. LESS SCSS 预编译语言

      前  言 JRedu LESS  是一门 CSS 预处理语言,它扩展了 CSS 语言,增加了变量.Mixin.函数等特性,使 CSS 更易维护和扩展. LESS 为 Web 开发者带来了福音,它在 ...

  4. Android环境准备

    Android环境准备: 1.安装Java环境(自行安装) 2.下载Android SDK包 3.配置系统环境变量 新建ANDROID_HOME 变量值:SDK安装路径(如:D:\android-sd ...

  5. gerrit代码简单备份方案分享

    由于前期部署了gerrit代码审核系统,开发调整后的线上代码都放到gerrit上,这就要求我们要保证代码的安全.所以,对gerrit代码的备份至关重要! 备份的策略是:1)先首次将gerrit项目代码 ...

  6. MySQL针对Swap分区的运维注意点

    Linux有很多很好的内存.IO调度机制,但是并不会适用于所有场景.对于运维人员来说,Linux比较让人头疼的一个地方是:它不会因为MySQL很重要就避免将分配给MySQL的地址空间映射到swap上. ...

  7. better-scroll的参数和方法

    格式:let obj = new BScroll(object,{[option1,],.,.}); 注意,如果在某一个组件内创建了一个BScroll的实例,在组件生命周期结束前要注意调用destro ...

  8. 容斥原理I

    普利斯记号 以下以"人"代指受条件约束的元素. \(K(x)\)表示刚好\(x\)人满足条件的方案数. \(S(x)\)表示至少\(x\)人满足条件的方案数. \(C(x)\)表示 ...

  9. 软工个人博客-week7

    Part 1       No Silver Bullet - Essence and Accidents of Software Engineering软件工程中没用通用的方法或者技术让软件工程在短 ...

  10. 学习github心得

    Git 是 Linux 的创始人 Linus Torvalds 开发的开源和免费的版本管理系统,利用底层文件系统原理进行版本控制的工具.Git是目前为止最著名运用最好最受欢迎的分布式的配置管理工具. ...