`
oywl2008
  • 浏览: 1050786 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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 

等等
当然还有牛人使用位运算来实现权限控制,加密技术,里面的奥秘深不可测啊!哈哈。

 

 

http://www.52ij.com/jishu/102.html

分享到:
评论

相关推荐

    Java位运算符详解[文].pdf

    Java中的位运算符是编程语言中用于操作整数在二进制表示下的基本逻辑运算,它们在处理二进制数据时特别有用。本文主要讲解了Java中的几种位运算符及其应用。 1. **按位与运算符(&)**: - 这个运算符对两个数的每...

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

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

    Java基础知识总结

    位运算符是指Java语言中的符号,用于执行位运算操作,如AND、OR、XOR等。位运算符可以用于实现数据压缩、加密和解密等操作。 数组 数组是指Java语言中的一个基本数据结构,用于存储多个相同类型的元素。数组可以...

    java数据类型与运算符间的运算

    此外,还有一个特殊的引用数据类型——字符串(String),它在Java中广泛使用。每种数据类型都有其特定的范围和用途。 在运算符方面,Java提供五类主要的运算符: 1. **算术运算符**:包括二元运算符(+、-、*、/...

    java面试题总结

    ### Java面试题总结知识点 #### 1. J2EE是什么? - **定义**:J2EE(Java 2 Platform, Enterprise Edition)是一个基于Java SE平台的企业级应用开发平台标准,由Sun Microsystems制定。 - **组成**:J2EE平台包含...

    培训学校java入伍篇

    从给定的文件信息中,我们可以提炼出一系列与Java编程相关的知识要点,这些知识点涵盖了从Java的历史背景到其核心语法及高级特性的广泛内容。以下是对这些知识点的详细阐述: ### Java简史 - **Java前传**:介绍了...

    威java资料信息

    Java的类库被组织成多个包,每个包都有其特定的功能和用途。例如: - `java.applet`:提供创建Applet所需的所有类,适用于网页上的小型应用程序。 - `java.awt.*`:包含创建用户界面、绘图和管理图形、图像的类。 -...

    异或运算

    异或运算,也被称为XOR(Exclusive OR)运算,是计算机科学中的一种基本逻辑运算,广泛应用于各种领域,包括加密、校验、数据处理等。它具有以下特性: 1. **定义**:异或运算是两个二进制位进行比较,如果两者相同...

    java学习基础入门

    1. **Java简介**:Java是由Sun Microsystems(现为Oracle公司)于1995年推出的一种面向对象的编程语言,以其“一次编写,到处运行”的跨平台特性受到广泛欢迎。Java的设计目标是具有高可靠性、安全性、性能和可移植...

    JAVA基础班总结大全.doc

    【JAVA基础班总结大全】 Java 是一种广泛使用的高级编程语言,以其“一次编写,到处运行”的跨平台特性著名。本文将深入讲解Java的基础知识,帮助初学者巩固理解,为将来的技术面试做好准备。 1. **JVM、JRE 和 ...

    Java异或.docx

    Java中的异或运算符(XOR)是位运算符的一种,它在编程中有着广泛的用途,尤其是在数据处理、加密算法和优化代码等方面。异或运算符用"^"表示,主要用于二进制数字的操作,其基本原理是对两个操作数的每一位进行比较,...

    取余运算规则 (2).docx

    在数论和编程中,取余运算有着广泛的用途,例如判断奇偶性、检验素数、进行模幂运算以及寻找最大公约数等。 在数论中,当我们对整数n除以正整数p时,可以得到一个整数商k和余数r,满足关系n=kp+r,其中0≤r。这里的...

    java开发视频

    - **第一个JAVA程序的总结和提升**: 对第一个程序进行总结,了解其中的关键概念,如类、方法、主函数等。 - **常用Java开发工具**: Eclipse、IntelliJ IDEA等,这些工具提供了代码编辑、调试等功能,大大提高了开发...

    java关键字和java命名规范.pdf

    Java关键字是Java语言内置的、具有特殊用途的保留字,而命名规范则是关于如何给类、方法、变量等命名的约定。 ### Java关键字 Java关键字(也称为保留字)是指在Java语言中具有特殊含义的词,它们不能用作变量名、...

    java自考重点知识讲解

    ### Java自考重点知识讲解 ...Java作为一种广泛应用的编程语言,其强大的功能和灵活性使其成为许多领域的首选语言之一。无论是从事软件开发还是继续深入学习其他编程技术,掌握Java都是非常有益的。

    java2Hoja1:数据结构工作表1

    Java作为一种广泛应用的面向对象的语言,提供了丰富的数据结构来支持各种复杂的问题解决。本知识点我们将深入探讨“java2Hoja1:数据结构工作表1”中的主要内容。 首先,我们要理解什么是Java中的基本数据结构。Java...

    28个java常用的工具类

    以下是28个Java开发者经常使用的工具类的概述,这些工具类涵盖了广泛的用途: 1. **`java.util.Arrays`**: 这个类提供了对数组进行排序、查找、复制等操作的方法,如`Arrays.sort()`用于排序数组,`Arrays.asList()...

    acm icpc java模板

    Java作为一门广泛使用的编程语言,在其标准库中提供了`java.math`包来处理大数字计算,其中`BigInteger`和`BigDecimal`类尤其适用于处理超过基本数据类型如`long`和`double`所能表示范围的数值。本文将深入探讨这些...

    Java基础知识八股文.docx

    Java是一种广泛使用的高级编程语言,由Sun Microsystems公司的James Gosling等团队于1991年开始开发,最初名为Oak,旨在用于控制嵌入式设备如电视遥控器和个人数字助理(PDA)等微处理器。1994年改名为Java,并逐渐...

    编程语言java日记.pdf

    Java是一种广泛使用的编程语言,由Sun Microsystems公司于1995年推出,现为Oracle公司所有。Java语言设计上追求面向对象、简单性、健壮性、安全性、跨平台性、多线程和动态性。Java应用程序可以在不同操作系统和平台...

Global site tag (gtag.js) - Google Analytics