一、位运算符
位运算符用来对二进制位进行操作,~,&,|,^分别为取反,按位与与,按位与或,按位与异或运算,如下表实例:
p | q | p & q | p | q | p ^ q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
进行位运算:
运算符 | 描述 | 图解 | 实例 |
---|---|---|---|
& | 按位与。按位与运算符对两个数进行操作,然后返回一个新的数,这个数的每个位都需要两个输入数的同一位都为1时才为1。 | (A & B) 结果为 60, 二进制为 0011 1100 | |
| | 按位或。按位或运算符|比较两个数,然后返回一个新的数,这个数的每一位设置1的条件是两个输入数的同一位都不为0(即任意一个为1,或都为1)。 | (A | B) 结果为 254, 二进制为 1111 1110 | |
^ | 按位异或. 按位异或运算符^比较两个数,然后返回一个数,这个数的每个位设为1的条件是两个输入数的同一位不同,如果相同就设为0。 | (A ^ B) 结果为 17, 二进制为 0001 0001 | |
~ | 按位取反运算符~对一个操作数的每一位都取反。 | (~A ) 结果为 240, 二进制为 1111 0000 | |
<< | 按位左移。左移操作符(<<)将操作数的所有位向左移动指定的位数。 | 下图展示了11111111 << 1(11111111 左移一位)的结果。蓝色数字表示被移动位,灰色表示被丢弃位,空位用橙色的0填充。 | A << 2 结果为 254, 二进制为 1111 1110 |
>> | 按位右移。右移操作符(>>)将操作数的所有位向右移动指定的位数。 | 下图展示了11111111 >> 1(11111111 右移一位)的结果。蓝色数字表示被移动位,灰色表示被丢弃位,空位用橙色的0填充。 | A >> 2 结果为 127, 二进制为 0111 1111 |
二、byte数组与int,long,short以及String的转换
基本步骤:
①分析转化和代转化之间位数的关系
②计算偏移量。每次都取最后8位
③把最后8位和0xff进行&操作
④得出结果。
1.byte数组与int转换
1.1 int转byte[]
int占4byte,例如873220774用二进制表示,
00110100 00001100 01001010 10100110
要将int转换成byte数组,则需要用byte[4]来存储。
又可以分为低位在前,高位在后和高位在前,低位在后两种方式。要将上述的int数组用byte数组表示,以低位在前,高位在后为例,则
byte[] a = new byte[4]
a[0] = 10100110;
a[1] = 01001010;
a[2] = 00001100;
a[3] = 00110100;
要将int转换成上面的样式,实现的原理如下图所示
代码实现
/**
* 将int数值转换为占四个字节的byte数组,本方法适用于(低位在前,高位在后)的顺序。
*
* @param value 要转换的int值
* @return byte数组
*/
public static byte[] intToBytes(int value) {
byte[] src = new byte[4];
src[3] = (byte) ((value >> 24) & 0xFF);
src[2] = (byte) ((value >> 16) & 0xFF);
src[1] = (byte) ((value >> 8) & 0xFF);
src[0] = (byte) (value & 0xFF);
return src;
}
/**
* 将int数值转换为占四个字节的byte数组,本方法适用于(高位在前,低位在后)的顺序。
*/
public static byte[] intToBytes2(int value) {
byte[] src = new byte[4];
src[0] = (byte) ((value >> 24) & 0xFF);
src[1] = (byte) ((value >> 16) & 0xFF);
src[2] = (byte) ((value >> 8) & 0xFF);
src[3] = (byte) (value & 0xFF);
return src;
}
1.2 byte[]转int
byte[]转int则是将上面的操作反过来
代码实现
/**
* byte数组中取int数值,本方法适用于(低位在前,高位在后)的顺序。
*
* @param src byte数组
* @return int数值
*/
public static int bytesToInt(byte[