目录
前言
进制对我们今后理解更复杂的知识有着重要作用。对于整数来说有四种表示方式:二进制、十进制、八进制、十六进制。而我们的计算机是以二进制的方式进行存储的。接下来我们深入地学习一下进制的知识。
一、进制的基本介绍
正如,前言所说整数的进制有四种:
二进制:0、1 满2进1,以0b或0B开头
十进制:0-9 满10进1
八进制:0-7 满8进1,以数字0开头
十六进制:0-9及A(10)-F(15) 满16进1,以0x或0X开头表示。此处的A-F不区分大小写
代码举例:
public class CSDN {
//编写一个main方法
public static void main(String[] args) {
//n1 二进制
int n1 = 0b1010;
//n2 十进制
int n2 = 1024;
//n3 八进制
int n3 = 01024;
//n4 十六进制
int n4 = 0X1024;
System.out.println("n1 = " + n1);
System.out.println("n2 = " + n2);
System.out.println("n3 = " + n3);
System.out.println("n4 = " + n4);
}
}
进制的图示:
十进制 | 十六进制 | 八进制 | 二进制 |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 2 | 2 | 10 |
3 | 3 | 3 | 11 |
4 | 4 | 4 | 100 |
5 | 5 | 5 | 101 |
6 | 6 | 6 | 110 |
7 | 7 | 7 | 111 |
8 | 8 | 10 | 1000 |
9 | 9 | 11 | 1001 |
10 | A | 12 | 1010 |
11 | B | 13 | 1011 |
12 | C | 14 | 1100 |
13 | D | 15 | 1101 |
14 | E | 16 | 1110 |
15 | F | 17 | 1111 |
16 | 10 | 20 | 10000 |
17 | 11 | 21 | 10001 |
二、进制之间的转换
1、二、八、十六进制转十进制
1)二进制转十进制
规则:
从最低位(右边)开始,将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和
例子:将 0b1011 转成十进制的数
0b1011 = 1 * 2^(1-1) + 1 * 2^(2-1) + 0 * 2^(3-1) + 1 * 2^(4-1) = 1 + 2 + 0 + 8 = 11
2)八进制转十进制
规则:
从最低位(右边)开始,将每个位上的数提取出来,乘以8的(位数-1)次方,然后求和
例子:将 0234 转成十进制的数
0234 = 4 * 8^(1-1) + 3 * 8^(2-1) + 2 * 8^(3-1) = 4 + 24 + 128 = 156
3)十六进制转十进制
规则:
从最低位(右边)开始, 将每个位上的数提取出来, 乘以 16 的(位数-1)次方, 然后求和
例子:
请将 0x23A 转成十进制的数
0x23A = 10 * 16^0 + 3 * 16 ^ 1 + 2 * 16^2 = 10 + 48 + 512 = 570
2、十进制转换成二、八、十六进制
1)十进制转二进制
规则:
将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制
例子:
请将 34 转成二进制
2)十进制转八进制
规则:
将该数不断除以8,直到商为0为止,然后将每步得到的余数倒过来,就是对应的八进制
例子:
请将 131 转成八进制
3)十进制转十六进制
规则:
将该数不断除以16, 直到商为 0 为止, 然后将每步得到的余数倒过来, 就是对应的十六进制。
例子:
请将 237 转成十六进制
3、二进制转八、十六进制
1)二进制转八进制
规则:
从低位开始,将二进制数每三位一组, 转成对应的八进制数即可
例子:
请将 0b11010101 转成八进制
0b11010101 => 0b11(3)010(2)101(5) => 0325
那为什么是每三位一组呢?这是因为二进制111是7,可以很好地表示0-7即一位八进制的范围
2)二进制转十六进制
规则:
从低位开始, 将二进制数每四位一组, 转成对应的十六进制数即可
例子:
请将 0b11010101 转成十六进制
0b11010101 => 0b11010101 => 0b1101(D)0101(5) => 0xD5
为什么是四位一组?四位1111最大数为15,可以很好的表示0-F即一位的十六进制的范围。
4、八、十六进制转二进制
1)八进制转二进制
规则:
将八进制数每 1 位, 转成对应的一个 3 位的二进制数即可
八进制转二进制、二进制转八进制可以看成逆过程,即把八进制的每一位转成一个对应的三位的二进制即可。
例题:
请将 0237 转换成二进制
0237 => 02(010)3(011)7(111) => 0b10011111
2)十六进制转二进制
规则:
将十六进制数每 1 位, 转成对应的 4 位的一个二进制数即可
十六进制转二进制、二进制转十六进制可以看成逆过程,即把十六进制的每一位转成一个对应的三位的二进制即可。
例题:
请将 0x23B 转成二进制
0x23B => 0x2(0010)3(0011)B(1011) => 0b001000111011
三、原码、反码与补码
现代的电子计算机技术全部采用的是二进制因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制数来表示的。而二进制又分为原码、反码和补码三种,真正存储在计算机内的是二进制的补码形式。我们一起来学习二进制的原码、反码以及补码,这为后面我们进行位运算符的学习打下基础。
对于有符号的而言,又一下规则需要我们记住的:
- 二进制的最高位是符号位:0表示正数,1表示负数
- 正数的原码、反码、补码都相同(三码合一)
- 负数的反码 = 它的原码符号位不变,其他位取反(即0—>1,1—>0)
- 负数的补码 = 它的反码 + 1,负数的反码 = 负数的补码 - 1
- 0的反码、补码都是0
- Java没有无符号数,即:Java中的数都是有符号的
- 在计算机运行时,都是以补码的方式来运算的
- 当我们看运算结果的时候,是看它的原码
根据上面的规则我们来举一个负数(正数的原码、反码、补码都相同)的例子—写出-3的原码、反码、补码:
- 原码:10000000 00000000 00000000 00000011
- 反码:11111111 11111111 11111111 11111100
- 补码:11111111 11111111 11111111 11111101
四、位运算符
1、位运算符一览
按位与:& | 两位全为1,结果为1,否则为0 |
按位或:| | 两位有一个为1,结果为1,否则为0 |
按位异或:^ | 两位相同即为0,不相同即为1 |
按位取反:~ | 0—>1,1—>0 |
算术右移:>> | 低位溢出,符号位不变,并用符号位补溢出的高位 |
算术左移:<< | 符号位不变,低位补 0 |
逻辑右移(无符号右移):>>> | 低位溢出, 高位补 0 |
特别说明:没有 <<< 符号
2、代码举例
1)&、|、^、~
①:计算 -3 & 4
我们前面说到过进行位运算是二进制的补码进行计算,即我们先得出-3和4的补码:
11111111 11111111 11111111 11111100 — -3的补码
00000000 00000000 00000000 00000100 — 4的补码
根据&规则得:
00000000 00000000 00000000 000000100 — -3&4 = 4
^、|、~的计算与&步骤一致,都是先将两个数的补码先得出来,得出来之后根据不同的位运算符的规则得出结果的补码,若该数为正数即该二进制码为原码,若该数为负数则需要进行转换成原码,得到最后的结果。
②:计算 6 | 3
00000000 00000000 00000000 00000110 — 6的补码
00000000 00000000 00000000 00000011 — 3的补码
根据 | 规则得:
00000000 00000000 00000000 00000111 — 6|3 = 7
③:计算 4 ^ 8
00000000 00000000 00000000 00000100 — 4的补码
00000000 00000000 00000000 00001000 — 8的补码
根据 ^ 规则得:
00000000 00000000 00000000 00001100 — 4 ^ 8 = 12
④:计算 ~5
00000000 00000000 00000000 00000101 — 5的补码
根据 ~ 规则得:
11111111 11111111 11111111 11111010 — ~5后的补码
11111111 11111111 11111111 11111001 — ~5后的反码
10000000 00000000 00000000 00000110 — ~5后的原码 — 即最后结果 = -6
2)<<、>>、>>>
①:计算 -1 >> 2
11111111 11111111 11111111 11111111 — -1的补码
低位溢出,符号位不变,并用符号位(此符号位为1)补溢出的高位:
11111111 11111111 11111111 11111111 — -1 >> 2 = -1
②:计算 6 << 3
00000000 00000000 00000000 00000110 — 6的补码
符号位不变,低位补 0
00000000 00000000 00000000 00110000 — 6 << 3 = 48
③:计算 2 >>> 3
00000000 00000000 00000000 00000010 — 2的补码
低位溢出, 高位补 0
00000000 00000000 00000000 00000000 — 2 >>> 3 = 0