java 位运算详解

来源:互联网 发布:施工计划横道图软件 编辑:程序博客网 时间:2024/04/30 11:37


一,java的数据构成:

我们知道,任何数据在计算机中都是以二进制表示的,一个二进制位被称为bit,8个bit组成一个字节,不同的数据类型由若干个字节组成,

例如:int 由 4个字节组成,即共有32个bit ,32个bit组合的和最小/大值即为int的取值范围。

最小值为 10000000 00000000 00000000 00000000,即 -2147483648

最大值为 01111111 11111111 11111111 11111111,即 2147483647(注:最高位为1代表负数,0代表正数)

由此可知int的取值范围为 -2147483648-2147483647

 

二,位运算优势:

所谓位运算就是对位的操作,通过位运算可以以最高的效率构造和变更任何数据,例如int i=2;把i变为8,我们该如何做?

你可以会这样写:

i=i*2*2;

这样写无可厚非可以实现,但是效率并不高,因为java在执行 i=i*i*i;这句话时要做很多事情,例如首先要从内存中读取I的值,然后再把值转换为java的int类型,最后还得经过数学运算,并且把值写入内存,非常繁琐(虽然这些活不用我们去做)。

 

你也可以这样写:

i <<= 2;//左移并赋值

这样写的效率高的无可挑剔,因为位运算是在最底层之间对位进行操作,绕过了java层面的内存和数学运算。

 

三,位运算符介绍:

Java提供4个位运算符号,分别是:&,| ,^ ,~,<<,>>

1,& (与):

从低位开始比较,两边都是1时,结果为1,否则为0。例如19 & 25即为 10011 & 11001,等于10001。该运算符的常见应用场景是从一串bit中抽取一部分,例如想抽取1101101的低四位,用1101101&0001111就可以得到低四位1101了。

2,|(或):

从低位开始比较,两边有一位、或者都是1时,结果为1,否则为0。例如19 |25即为 10011 | 11001,结果就等于11011。该运算符的常见应用场景是拼接两串bit,例如想把1010接在1101101的后四位,用11011010000|00000001011就可以得到11011011011了。

一般还可以用|,通过byte数组来构造一个short或int。例如现在有2个字节byte[]{0x09,0x12},需以大端模式(注:此处为示例,涉及字节序和16进制表示,如果不懂,可以跳过。)转换为short,我们知道short本身就是由两个字节拼成的,那如何把两个字节进行拼接呢,这里就用到或运算符了 |,具体实现如下

 

 
    byte[] b=new byte[]{0x09,0x12};//0x09=00001001,0x12=00010010,一个字节为8为,为了方便理解,所以在前面补0,无其他意义。        short s = 0;       short s0 = (short) (b[1] & 0xff);// b[1]为高地址,放在最低位    short s1 = (short) (b[0] & 0xff);// b[0]为低地址,放在最高位    s1 <<= 8;    s = (short) (s0 | s1);    //s=0000100100010010


 

3,^(异或)

从低位开始比较,两边位不同时,结果为1,否则为0。例如 12^9=5;//1100^1001=0101

4,~(非)

从低位开始比较,1变0,0变1.

 

5,<<(左移)

将目标在低位补0,溢出的丢弃

例1:

2<<2=8//10<<2=1000,左移补0;

 

例2:

byte a=26;//11010

a<<4;//=110100000 共九位,但是我们知道,byte最高为8位,所以要把高位丢弃,最终结果为10100000

System.out.println(a);//160

 

6,>>右移

将目标从低位开始,丢弃n位

byte a=26;//11010

a>>2;//=110

System.out.println(a);//6

 

位运算在日常工作中用的不多,但是涉及到网络传输层对字节的处理时候,经常用到。由于个人水平有限,难免出差,敬请斧正。

 

 

0 0
原创粉丝点击