`
lxwt909
  • 浏览: 570795 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java位运算总结

阅读更多

      这是自己4年前的Java学习笔记,现发布在ITEye留作纪念,同时也希望对那些刚刚接触Java的童鞋们有些许帮助。

      

      情如痕,缘似印,奈何情深缘浅海誓山盟空对月,流尽痴泪只为你我心再近,踏破情路惟愿红尘有你。

 

                                                                                                                                  ---------清晨随感

 

 

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

       首先要明白一个概念,Java位运算是针对于整型数据类型的二进制进行的移位操作。主要包括位与、位或、位非,有符号左移、有符号右移,无符号右移等等。需要注意一点的是,不存在无符号左移<<<运算符。根据位运算的概念规定,我们首先需要弄明白两个问题,java有哪些数据类型是整型数据类型和各数字进制之间转换问题。Java整型数据类型有:byte、char、short、int、long。要把它们转换成二进制的原码形式,必须明白他们各占几个字节。我们都知道,一个字节占8位。
      数据类型                           所占位数
      byte                                       8 
      boolean                                8
      short                                    16
      int                                         32 
      long                                      64 
      float                                      32 
      double                                  64 
      char                                     16

还需要明白一点的是:计算机表示数字正负不是用+ -加减号来表示,而是用最高位数字来表示,0表示正,1表示负

所以比如-4用二进制原码表示就是1111 1111 1111 1111 1111 1111 1111 1100

 

下面根据实例一个一个的来说明各种位运算的运算规则:
位与&(真真为真 真假为假 假假为假)
4&6
0000 0000 0000 0000 0000 0000 0000 0100
0000 0000 0000 0000 0000 0000 0000 0110
0000 0000 0000 0000 0000 0000 0000 0100
结果:4

位或|(真真为真 真假为真 假假为假)
4|6
0000 0000 0000 0000 0000 0000 0000 0100
0000 0000 0000 0000 0000 0000 0000 0110
0000 0000 0000 0000 0000 0000 0000 0110
结果:6

位非~(取反码)【注:Java中正数的最高位为0,负数最高位为1,即最高位决定正负符号】
~4
0000 0000 0000 0000 0000 0000 0000 0100
1111 1111 1111 1111 1111 1111 1111 1011

解码:先取反码,再补码
0000 0000 0000 0000 0000 0000 0000 0100
0000 0000 0000 0000 0000 0000 0000 0101
结果:-5

位异或^(真真为假 真假为真 假假为假)
4^6
0000 0000 0000 0000 0000 0000 0000 0100
0000 0000 0000 0000 0000 0000 0000 0110
0000 0000 0000 0000 0000 0000 0000 0010
结果:2

有符号右移>>(若正数,高位补0,负数,高位补1)
-4>>2
1111 1111 1111 1111 1111 1111 1111 1100   原码
1111 1111 1111 1111 1111 1111 1111 1111   右移,最左边空出两位按规则负数空位补1
0000 0000 0000 0000 0000 0000 0000 0000   解码
0000 0000 0000 0000 0000 0000 0000 0001   补码(补码即最后一位+1)
结果:-1


有符号左移<<(若正数,高位补0,负数,高位补1)
-4<<2
1111 1111 1111 1111 1111 1111 1111 1100   原码
1111 1111 1111 1111 1111 1111 1111 0000   左移,最右边空出两位补0
0000 0000 0000 0000 0000 0000 0000 1111   解码
0000 0000 0000 0000 0000 0000 0001 0000   补码
结果:-16

无符号右移>>>(不论正负,高位均补0)
-4>>>2
1111 1111 1111 1111 1111 1111 1111 1100   原码
0011 1111 1111 1111 1111 1111 1111 1111   右移(由于高位均补0,故>>>后的结果一定是正数)
结果:1073741823

由于数据类型所占字节是有限的,而位移的大小却可以任意大小,所以可能存在位移后超过了该数据类型的表示范围,于是有了这样的规定:
如果为int数据类型,且位移位数大于32位,则首先把位移位数对32取模,不然位移超过总位数没意义的。所以4>>32与4>>0是等价的。

如果为long类型,且位移位数大于64位,则首先把位移位数对64取模,若没超过64位则不用对位数取模。

如果为byte、char、short,则会首先将他们扩充到32位,然后的规则就按照int类型来处理。

 

        学到这里,我想你也可能会问,位运算到底有什么用途或者有哪些场景可以应用到它。因为位运算的运算效率比直接对数字进行加减乘除高很多,所以当出现以下情景且对运算效率要求较高时,可以考虑使用位运算。不过实际工作中,很少用到它,我也不知道为什么很少有人用它,我想应该是它比较晦涩难懂,如果用它来进行一些运算,估计编写的代码的可读性会不强,毕竟我们写的代码不仅仅留给自己一个人看。
1.  判断int型变量a是奇数还是偶数    
     a&1  = 0 偶数 
     a&1 =  1 奇数 
2.  求平均值,比如有两个int类型变量x、y,首先要求x+y的和,再除以2,但是有可能x+y的结果会超过int的最大表示范围,所以位运算就派上用场啦。
      (x&y)+((x^y)>>1); 
3.  对于一个大于0的整数,判断它是不是2的几次方
    ((x&(x-1))==0)&&(x!=0); 
4.  比如有两个int类型变量x、y,要求两者数字交换,位运算的实现方法:性能绝对高效
    x ^= y; 
    y ^= x; 
    x ^= y; 
5. 求绝对值
    int abs( int x ) 
   { 
     int y ; 
     y = x >> 31 ; 
    return (x^y)-y ;        //or: (x+y)^y 
   }
6.  取模运算,采用位运算实现:
     a % (2^n) 等价于 a & (2^n - 1) 
7.  乘法运算   采用位运算实现
     a * (2^n) 等价于 a << n
8.   除法运算转化成位运算
      a / (2^n) 等价于 a>> n 
9.   求相反数
      (~x+1) 
10  a % 2 等价于 a & 1 

0
1
分享到:
评论

相关推荐

    位运算课件(java学习位运算课件)

    位运算在Java编程中是底层操作,用于...总结来说,位运算是Java编程中的一个重要部分,它涉及到计算机如何存储和处理数据的基本原理。理解位运算的概念和操作,能帮助开发者编写更高效、更底层的代码,解决复杂的问题。

    java位运算,符号运算 详细解释

    Java位运算是一种底层...总结,Java中的位运算符是编程工具箱中的重要部分,它们提供了对数据二进制表示的直接操作能力,有助于实现高效的算法和数据处理。理解并熟练掌握位运算是成为高级Java开发者的关键步骤之一。

    java面试总结

    java面试总结java面试总结java面试总结java面试总结java面试总结java面试总结java面试总结

    java异或-Java异或运算总结.pdf

    Java中的异或运算是一种二进制位操作,用于处理整数。异或运算符用`^`表示,其运算规则是:如果两个位相同,则结果为0;如果两个位不同,则结果为1。这种运算在计算机科学中有着广泛的应用,尤其是在位操作、数据...

    java位运算1.pdf

    总结来说,Java中的位运算提供了低级别数据处理的能力,虽然在日常编程中可能用得不多,但在特定场合如优化代码、处理二进制数据或进行高效计算时,它们是不可或缺的工具。理解并熟练掌握位运算能够帮助开发者编写出...

    java复数运算器

    总结来说,“java复数运算器”项目是一个教育性的应用,它展示了如何使用Java来处理复数运算,同时提供了用户友好的界面。初学者可以通过此项目学习到Java面向对象编程、GUI设计以及复数运算的原理。

    Java变量与数据类型、数据运算中易混知识点总结

    在数据运算方面,Java支持算术运算、关系运算、逻辑运算、位运算和赋值运算。算术运算包括加法(+)、减法(-)、乘法(*)、除法(/)、取模(%)等。关系运算符如大于(&gt;)、小于(&lt;)、等于(==)等用于比较两个...

    Java异或运算(简单的加密,解密)

    总结来说,这些Java代码示例涵盖了异或运算的基本概念,以及它在数据加密、调试和优化算法中的用途。理解并熟练运用这些知识对于编写高效、安全的Java程序至关重要。在实际项目中,你可以根据需求选择合适的工具和...

    Java编写的大数运算

    总结来说,这个Java项目展示了如何利用Java的`BigInteger`类进行大数运算,同时体现了面向对象编程的设计原则。开发者通过自定义类封装了大数运算的逻辑,并进行了调试以确保代码的正确性。遗憾的是,没有提供更多的...

    Java生成算数运算中文图片验证码

    总结起来,Java生成算数运算中文图片验证码的技术要点包括:随机算术表达式的生成、图像的绘制与扭曲、服务器端的验证逻辑以及项目组织结构的设计。这种验证码机制结合了语言和数学,既增加了安全性,又保持了用户...

    JAVA位运算的知识点总结

    "JAVA位运算的知识点总结" 一、JAVA中的数据是如何进行计算的? 在计算机中,数据是以二进制形式存储的,每个byte类型的数据占8个bit位,其中左边第一位表示符号位,符号位如果为1表示负数,为0则表示正数。要推算...

    java实现自动生成四则运算实验报告.docx

    Java 实现自动生成四则运算实验报告主要涵盖了以下几个方面的知识点: 1. **命令行参数处理**:通过-n 和-r 参数来控制生成题目的数量和数值范围。在Java中,可以使用`java.util.Scanner`类从命令行读取参数,或者...

    java知识点总结

    java知识点总结 一、Java 概述 Java 语言的发展始于 1991 年,由 Sun 公司的 James Gosling 等人开始开发,最初命名为 Oak,旨在用于控制嵌入在有线电视交换盒、PDA 等的微处理器。1994 年更名为 Java。Java 语言...

    logisim16位自动运算器

    实验报告——构建16位自动运算器 1. 实验目的 本次实验旨在让学生深入理解数字电路设计的基础,特别是运算器的设计与应用。通过使用Logisim软件,实验者需熟悉该平台的操作,掌握算术逻辑单元(ALU)的工作原理,...

    Java课程设计总结报告(计算器)

    Java课程设计总结报告,是关于计算器的。2.主体功能 a.按下数字键在文本框上会显示数字,这是计算器最基本的功能。 b.按下数字键加上“+-*/%”加上数字键进行加、减、乘、除、求余计算。 c.按下“+-”键,计算器下...

    Java编写的大整数四则运算

    ### Java编写的大整数四则运算:深入解析与理解 #### 概述 在计算机科学领域,处理大整数运算是一项挑战,特别是在超出标准整数类型(如`int`或`long`)所能表达的范围时。Java语言通过内置的`BigInteger`类提供了...

    Java 基础核心总结.pdf

    11. **标准库**:Java标准库(Java API)包含大量的预定义类和接口,如`java.io`,`java.lang`,`java.math`和`java.net`包,分别对应输入/输出,基本语言功能,数学运算和网络通信。 12. **版本发展**:随着技术的...

    java基础知识总结(经典)

    Java 基础知识总结是 Java 程序员不可或缺的一部分,本总结将涵盖 Java 的基础知识,包括 Java 概述、Java 语法基础、变量、数据类型、运算符、控制语句、方法、数组、继承、多态、接口、异常、IO 流等。 一、Java ...

    Java计算器 四则混合运算

    ### Java计算器实现:四则混合运算解析 在深入解析给定的Java代码片段之前,我们首先需要理解其核心功能——实现一个能够处理包含加、减、乘、除四则混合运算的计算器。此计算器接收一个混合运算表达式作为输入,并...

Global site tag (gtag.js) - Google Analytics