Java位运算总结:位运算用途广泛

转载 2016年08月31日 14:34:51
首先要明白一个概念,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 

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

二进制转换及在java中的运用

十进制转二进制:短除法 例:十进制57转二进制 除数 商 余数 2/57 28 1 2/28 14 0 2/14 7 0 2/7 3 1 ...
  • qq_36184009
  • qq_36184009
  • 2017年02月27日 16:17
  • 206

基于位运算的权限控制

1 Linux基于位运算的权限控制 原理 在Linux文件系统中,一个用户对文件或目录所拥有的权限分为三种:”可读”、”可写”和”可执行”,分别用 1 、2 和 4 来表示,它们之间可以任意组...
  • ajian005
  • ajian005
  • 2013年01月10日 18:12
  • 3468

使用位运算控制权限

       位运算,就是将10进制数转换成2进数,在进行操作的运算。       假设系统有增加的操作,其权限值位1024(1...
  • lgm277531070
  • lgm277531070
  • 2010年12月09日 22:37
  • 1827

java 位运算 和实际应用

public class Test { public static void main(String[] args) { // 1、左移(
  • xiaoliuliu2050
  • xiaoliuliu2050
  • 2016年11月01日 12:51
  • 2178

——使用『与非』运算实现权限判断

 这种方法基于这样的数学原理:1)(2 | 4 | 16 | 32 | 256) & (4 | 32) == (4 | 32)2)Sigma ( 2n , n 是自然数 ) = 2n+1 - 1 ,即...
  • livening
  • livening
  • 2010年01月05日 16:03
  • 955

利用位运算处理权限分配来优化数据库存储,并且提高运算效率

这个是临阵磨枪的,在现在做的一个OA项目中,由于多权限造成后台静态管理网页泛滥了,现在不得不改进些新的技术,又因为以前的权限表是作为管理员表的外键,给这次修改带来很大麻烦,所以想到了类似与Linux的...
  • zhx278171313
  • zhx278171313
  • 2014年03月26日 23:21
  • 1462

Java位运算的应用

  • 2013年08月26日 18:58
  • 30KB
  • 下载

Java位运算在程序设计中的使用:位掩码(BitMask)

在Java中,位运算符有很多,例如与(&)、非(~)、或(|)、异或(^)、移位()等。这些运算符在日常编码中很少会用到。 在下面的一个例子中,会用到位掩码(BitMask),其中包含大量的位运算。不...
  • xiao__gui
  • xiao__gui
  • 2013年09月15日 11:40
  • 8908

java 位运算权限管控(转载)

这里笔者介绍一种很常用,也比较专业的权限控制思路。这里用java语言描述,其实都差不多的。要换成其他的语言主,自己转一下就可以了。为了方便起见,我们这里定义a^b为:a的b次方。这里,我们为每一个操作...
  • DuceXu
  • DuceXu
  • 2012年10月30日 14:16
  • 3051

java &|~<< 位运算设计权限代码!查询权限、增加权限、删除权限

java &|~>> 请参考我前几篇博文
  • liangrui1988
  • liangrui1988
  • 2014年02月25日 20:06
  • 1851
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java位运算总结:位运算用途广泛
举报原因:
原因补充:

(最多只允许输入30个字)