位运算符
Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。
位运算符作用在所有的位上,并且按位运算。假设a = 60,b = 13;它们的二进制格式表示将如下:
A = 0011 1100B= 0000 1101
-----------------A&B = 0000 1100A| B = 0011 1101A^ B = 0011 0001
~A= 1100 0011
下表列出了位运算符的基本运算,假设整数变量 A 的值为 60 和变量 B 的值为 13:
操作符描述例子
&
如果相对应位都是1,则结果为1,否则为0
(A&B),得到12,即0000 1100
|
如果相对应位都是 0,则结果为 0,否则为 1
(A | B)得到61,即 0011 1101
^
如果相对应位值相同,则结果为0,否则为1
(A ^ B)得到49,即 0011 0001
〜
按位取反运算符翻转操作数的每一位,即0变成1,1变成0。
(〜A)得到-61,即1100 0011
<<
按位左移运算符。左操作数按位左移右操作数指定的位数。
A << 2得到240,即 1111 0000
>>
按位右移运算符。左操作数按位右移右操作数指定的位数。
A >> 2得到15即 1111
>>>
按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。
A>>>2得到15即0000 1111
实例
下面的简单示例程序演示了位运算符。复制并粘贴下面的Java程序并保存为Test.java文件,然后编译并运行这个程序:
Test.java 文件代码:
public classTest {public static voidmain(String[] args) {int a = 60; /*60 = 0011 1100*/
int b = 13; /*13 = 0000 1101*/
int c = 0;
c= a & b; /*12 = 0000 1100*/System.out.println("a & b = " +c );
c= a | b; /*61 = 0011 1101*/System.out.println("a | b = " +c );
c= a ^ b; /*49 = 0011 0001*/System.out.println("a ^ b = " +c );
c= ~a; /*-61 = 1100 0011*/System.out.println("~a = " +c );
c= a << 2; /*240 = 1111 0000*/System.out.println("a << 2 = " +c );
c= a >> 2; /*15 = 1111*/System.out.println("a >> 2 = " +c );
c= a >>> 2; /*15 = 0000 1111*/System.out.println("a >>> 2 = " +c );
}
}
以上实例编译运行结果如下:
a & b = 12a| b = 61a^ b = 49
~a = -61a<< 2 = 240a>> 2 = 15a>>> 2 = 15
整数格式化成二进制
public static voidmain(String[] args) {int a = 0xff;
String b=Integer.toBinaryString(a);
System.out.println(a);
System.out.println(b);
}
结果:
255
11111111
十六进制所占字节
1个十六进制占4位(bit),1个字节(B)占8位(bit),所以一个十六进制占0.5个字节,即一个字节可以表示两个十六进制(2个十六进制 = 1个字节);
Java中各进制表示
int a = 0b12; //0b开头为二进制数
int b = 012; //0开头为八进制数
int c = 11; //默认为十进制数
int d = 0x11; //0x开头为十六进制数
注:0是阿拉伯数字不是字母
例子:
位运算记录多选状态
public static voidmain(String[] args) {final int TYPE_ONE = 1 << 0;final int TYPE_TWO = 1 << 1;final int TYPE_THREE = 1 << 2;int state = 0;
state= state | TYPE_ONE;//添加
state = state |TYPE_TWO;
state= state |TYPE_THREE;
state= state ^ TYPE_THREE;//去除
String binaryString =Integer.toBinaryString(state);
System.out.println("Current state=" +state);
System.out.println("Binary string=" +binaryString);
System.out.println((state& TYPE_ONE) ==TYPE_ONE);
System.out.println((state& TYPE_TWO) ==TYPE_TWO);
}
byte转16进制字符串
public static final String bytesToHexString(byte[] bArray) {
StringBuffer sb= newStringBuffer(bArray.length);
String sTemp;for (int i = 0; i < bArray.length; i++) {
sTemp= Integer.toHexString(0xFF & bArray[i]); //1111 1111 & bArray[i]
if (sTemp.length() < 2)
sb.append(0);
sb.append(sTemp.toUpperCase());
}returnsb.toString();
}
将两个字节拼接还原成有符号的整型数据
public static int pinJie2ByteToInt(byte byte1, bytebyte2) {int result =byte1;
result= (result << 8) | (0x00FF &byte2);returnresult;
}
整型数据拆分为长度为2的字节数组,低8位存放在序号小的元素,高8位存放在序号大的元素中(小端存储)
public static byte[] chaiFenDataIntTo2Byte(intdata) {byte[] byteArray = new byte[2];
byteArray[0] = (byte) data;
byteArray[1] = (byte) (data >> 8);returnbyteArray;
}
end