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