文章目录
一、概念
1.1 常用进制
项目 | 二进制 | 十进制 | 八进制 | 十六进制 |
---|---|---|---|---|
基本数字 | 2个:0,1 | 10个:0~9 | 8个:0~7 | 16个:0~9和 A~F |
进位规则 | 二进一 | 十进一 | 八进一 | 十六进一 |
位权 | 一个数码在不同的位置上所代表的值不同 |
1.2 表示
例如:20(十进制)
20÷2 = 10~0
10÷2 = 5~0
5÷2 = 2~1
2÷2 = 1~0
1÷2 = 0~1
即10100(二进制)。2^4 + 2^2 = 20
1.3 二进制的位运算
运算符 | 含义 | 示例 | 规则 |
---|---|---|---|
& | 与运算 | 6 & 3 = 2 | 全1则1 |
| | 或运算 | 6 | 3 = 7 | 有1则1 |
^ | 异或运算 | 6 ^ 3 = 5 | 不同则1 |
~ | 反码 | ~6 = -7 | 取反 |
<< | 左移 | 3 <<2 = 12 ; 322 = 12 | 左移右补0 |
>> | 右移 | 3 >>1 = 1 ; 3/2 = 1 | 右移左补0 |
>>> | 无符号右移 | 3 >>> 1 = 1 ;3/2 =1 |
1.3.1 &
6&3 = 2
0000 0110 & 0000 0011 = 0000 0010
1.3.2 |
6|3 = 7
0000 0110 & 0000 0011 = 0000 0111
1.3.3 ^
6^3 = 5
0000 0110 & 0000 0011 = 0000 0101
1.3.4 ~
- ~6 = -7
- 0000 0110 = 1111 1001
1.3.5 <<
3 <<2 = 12
0000 0011 = 0000 0110
1.3.6 >>
3 >>1 = 1
0000 0011 = 0000 0001
1.3.7 >>>
3 >>>1 = 1
0000 0011 = 0000 0001
1.4 二进制的补码与原码
1.4.1 原码
定义:一个整数的绝对值大小转换为二进制数。
例如:-14和14。绝对值都为14
二者的原码:0000 1110
二者的反码:1111 0001
1.4.2 补码
定义:一个整数,求反码,再用反码加1,得到的数。
二者的反码:1111 0001 + 1 = 1111 0010
1.4.3 正负整数
正数:以原码形式表示。
即:二进制最高位为0,如0000 1110。14
负数:以补码形式表示。
即:二进制最高位为1,1111 0010。-14
二、JDK内置进制转换
2.1 十进制转其他进制
Integer.toBinaryString(20); // 转为二进制。
Integer.toHexString(20); // 转为十六制。
Integer.toOctalString(20); // 转为八进制。
2.2 其他进制转十进制
Integer.parseInt("00001101",2); // 二进制。
Integer.parseInt("17",8); // 八进制。
Integer.parseInt("A8",16); // 十六进制得。
三、Java中的进制
3.1 数值型转化为字节
// 数值转化字节数组(此处为小端法)
public static byte[] int2Bytes(int id){
byte[] arr = new byte[4];
for(int i = 0; i < arr.length; i++){
arr[i] = (byte)((int)(id >> i * 8) & 0xff);// 其他
}
return arr;
outArray(arr);
}
// 字节数组输出。
public static void outArray(byte[] arr){
System.out.print("[" + arr[0] );
for(int i = 1; i < arr.length; i++){
System.out.print("," + arr[i]);
}
System.out.prinln("]");
}
// 结果:[-49,31,0,0]。小端法。
// [0,0,31,-49]。大端法。
// 字节数组转化数值。
public static int bytes2Int(byte[] arr){
int num = 0;
for(int i = 0; i < arr.length; i++){
arr[i] = (int)((arr[i] & 0xff)<< i * 8);
}
return num;
}
3.2 字符串转化为字节
3.2.1 字符串转化为字节数组
String str = "张三";
byte[] bs = str.getBytes();
for(int i = 0; i < bs.length; i++){
System.out.println(bs[i]);
}
// 结果:-27 -68 -96-28 -72 -119
3.2.2 字节数组转化为字符串
byte[] bs =new byte[];
String str = new String(bs);
// 结果:张三。