Java位运算知识点详解

  

在日常的Java开发中,位运算使用的不多,使用的更多的是算数运算(+、-、*、/?),关系运算(& lt;祝辞,& lt;=祝辞=?=?=)和逻辑运算(,,,| |,!),所以相对来说对位运算不是那么熟悉,本文将以Java的位运算来详细介绍下位运算及其应用。

  

<强> 1位运算起源

  

位运算起源于C语言的低级操作,Java的设计初衷是嵌入到电视机顶盒内,所以这种低级操作方式被保留下来。所谓的低级操作,是因为位运算的操作对象是二进制位,但是这种低级操作对计算机而言是非常简单直接,友好高效的。在简单的低成本处理器上,通常位运算比除法快得多,比乘法快几倍,有时比加法快得多。虽然由于较长的指令流水线和其他架构设计选择,现代处理器通常执行加法和乘法的速度与位运算一样快,但由于资源使用减少,位运算通常会使用较少的功率,所以在一些Java底层算法中,巧妙的使用位运算可以大量减少运行开销。

  

<强> 2位运算详解

  

Java位运算细化划分可以分为按位运算和移位运算,见下表。

  

              

细化         

符号         

描述         

运算规则

              

按位运算

        

        

        

两位都为1,那么结果为1

              

|

        

        

有一位为1,那么结果为1

              

~

        

非         

~ 0=1 ~ 1=0

              

^         

异或         

两位不相同,结果为1

              

移位运算

        

& lt; & lt;,

        

左移         

各二进制位全部左移N位,高位丢弃,低位补0

              

祝辞祝辞,

        

右移         

各二进制位全部右移N位,若值为正,则在高位插入0,若值为负,则在高位插入1

              

祝辞祝辞祝辞,

        

无符号右移

        

各二进制位全部右移N位,无论正负,都在高位插入0

              

  

在进行位运算详解之前,先来普及下计算机中数字的表示方法。对于计算机而言,万物皆为0,1,所有的数字最终都会转换成0,1的表示,有3种体现形式,分别是:原码,反码和补码。

  

原码:原码表示法在数字前面增加了一位符号位,即最高位为符号位,正数位该位为0,负数位该位为1,比如十进制的5如果用8个二进制位来表示就是00000101,5就是10000101。

  

反码:正数的反码是其本身,负数的反码在其原码的基础上,符号位不变,其余各个位取反。5的反码就是00000101,而5的则为11111010。

  

补码:正数的补码是其本身,负数的补码在其原码的基础上,符号位不变,其余各位取反,最后+ 1。即在反码的基础上+ 1.5的反码就是00000101,而5的则为11111011。

  

了解了这几个概念后,我们现在先记住一个结论,那就是在计算机系统中,数字一律用补码来表示,运算和存储,具体的原因可以看这篇文章的讨论,这里不做更多讨论,因为不是本文的重点。

  

2.1与运算(,)

  

规则:转为二进制后,两位为1,则结果为1,否则结果为0。

  

举例:   

              

十进制         

二进制(正数原码,反码,补码一致)

              

10         

00000000000000000000000000001010

              

, 12         

, 00000000000000000000000000001100               

=

        

=

              8

        

00000000000000000000000000001000

              

  

              

十进制         

二进制(原码)

              

6         

10000000000000000000000000000110

              2

        

, 10000000000000000000000000000010               

十进制         

Java位运算知识点详解