Java中的位运算及简单的算法应用介绍

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java中的位运算及简单的算法应⽤介绍
众所周知,计算机底层是⼆进制。

⽽java作为⼀门计算机编程语⾔,也对⼆进制的位运算提供了完整的⽀持。

在java中,int是32位的,也就是说可以⽤来实现32位的位运算。

⽅便起见,我们⼀般⽤16进制对它赋值,⽐如: 0011表⽰成16进制是 0x3, 110111表⽰成16进制是 0x37。

那么什么是位运算呢?位运算是将数据看做⼆进制,进⾏位级别的操作。

主要有移位运算和逻辑运算
移位运算:
左移:操作符为<<,向左移动,右边的低位补0,左边⾼位舍弃,将⼆进制看做整数,左移1位就相当于乘以2。

⽆符号右移:操作符为>>>,向右移动,右边的舍弃掉,左边补0。

有符号右移:操作符为>>,向右移动,右边的舍弃掉,左边补的值取决于原来最⾼位,原来是1就补1,原来是0就补0,将⼆进制看做整数,右移1位相当于除以2。

10进制转⼆进制的时候,因为⼆进制数⼀般分8位、 16位、32位以及64位表⽰⼀个⼗进制数,所以在转换过程中,最⾼位会补零。

在计算机中负数采⽤⼆进制的补码表⽰,10进制转为⼆进制得到的是源码,将源码按位取反得到的是反码,反码加1得到补码
⼆进制的最⾼位是符号位,0表⽰正,1表⽰负。

例如:
int a = 4; //100
a = a >> 2; //001,
System.out.println("4>>2运算的结果是 :" + a);//变为1
a = 4; //100
a = a << 3; //100000,
System.out.println("4<<3运算的结果是 :" + a);//变为32
System.out.println("16>>2运算的结果是 :" + ((16) >> 2));//变为4
System.out.println("-16>>2运算的结果是 :" + ((-16) >> 2));//变为-4
System.out.println("16>>>2运算的结果是 :" + ((16) >>> 2));//变为4
System.out.println("-16>>>2运算的结果是 :" + ((-16) >>> 2));//变为⼤的整数,看是多少位的
得到结果
可见正数做>>>运算的时候和>>是⼀样的。

区别在于负数运算.
逻辑运算有:
按位与 &:两位都为1才为1
按位或 |:只要有⼀位为1,就为1
按位取反 ~: 1变为0,0变为1
按位异或 ^ :相异为真,相同为假
例如:
int a = ...;
a = a & 0x1 // 返回0或1,就是a最右边⼀位的值。

a = a | 0x1 //不管a原来最右边⼀位是什么,都将设为1
我们来看⼏个简单的应⽤场景:
场景⼀:判断奇偶
分析:奇数都不是2的整数倍,转换成⼆进制后最低位必然为1,偶数则相反。

利⽤这个特性我们可以很容易的通过位运算判断⼀个整数的奇偶性。

看代码:
int i = 1;// ⼆进制存储⽅式为00000000000000000000000000000001
int j = 5;// ⼆进制存储⽅式为00000000000000000000000000000101
int k = 6;// ⼆进制存储⽅式为00000000000000000000000000000110
if ((i & j) == 1) {
System.out.println("j的最低位为1,为奇数");
}
if ((i & k) == 0) {
System.out.println("k的最低位为0,为偶数");
}
场景⼆:判断⼀个正整数是不是2的整数次幂
分析:我们先来看⼀下常见的2的整数次幂的数:2、4、8、16,转化成⼆进制依次为:10、100、1000、10000,发现规律了没有?那就是除了⾸位是1,其他全是0。

恰巧这些数减去1后等于他们依次按位取反的结果,⽐如8-1=7,⼆进制是111,可以通过8的⼆进制1000按位取反得到。

⽽8&7=0,提取⼀下规律就是:
(n&(n-1))==0
符合这个规律的n就是2的整数次幂了。

相关文档
最新文档