1、概述
现在的我们无时无刻不在接触计算机,即常说的电脑。计算机能干很多事,比如浏览网页、看视频、玩游戏、办公等,实现这些功能都需要计算机有信息存储和处理的能力。现代计算机的信息存储和处理都以二进制为基础,简单来说我们在电脑上看到的信息(比如文字、图片、音频、视频)都是以二进制表示的形式存储在计算机上或被计算机以二进制这种形式处理的。比如我们在计算机上的记事本中写日记,写入的是中文,在计算机中是以二进制编码(01010......)存储的,同时会给这些二进制编码指定一种解释方式,比如GB2312编码等,这样日记显示在屏幕上的才是中文。
为什么计算机选择二进制存储和处理信息?主要原因是二进制容易被电子元件表示、存储和传输,比如可以以电压高低表示0/1,或以磁场的方法顺时针和逆时针表示0/1等。我们日常使用十进制表示数字,原因是每个人都有十个手指或十个脚趾,使用十进制符合我们大部分人的认知,也方便日常使用。
1.1 计算机存储和表示的基本单位
计算机中存储和表示数据的基本单位是 位 (bit),和我们平常在十进制中所说的位概念相同,比如个位、十位、百位等。二进制中每位的取值范围是0或者1。
计算机中每8位代表一个字节(byte),即 1byte = 8bit,这是计算机中的常用存储大小单位。比字节大的还有KB、MB、GB、TB、PB、EB,其换算关系如下:
1KB = 1024B,1MB = 1024KB,1GB = 1024MB,1TB = 1024GB,1PB = 1024TB,1EB = 1024PB。’
需要注意两个问题:
1. B和b的区别,大写B代表字节,小写b代表比特位。比如1KB = 8Kb,常见的网速10Mbps,代表每秒10Mb,即大约1MB/s;
2. 标准换算关系是 1KB = 1024B,但在一般非正式计算中为了方便计算,使用1KB = 1000B,其他的依此类推。比如新买的电脑的磁盘或U盘,标称大小和实际大小不符合1024的换算关系,原因就是在工程制造中一般使用1000的换算比例,而计算机使用的1024的换算比例,所以会导致存在一定的偏差。
1.2 常用进制表示
从上面知道,计算机以二进制表示信息。比如:01100101,但我们人在书写和表达二进制编码时,就不是很方便了,因为二进制编码一般很长,且都是0或1,容易因为疏忽写错。为了解决这些问题,还有其他进制表示方法,用于辅助我们更好地认识和使用二进制。常见的进制有:二进制、八进制、十六进制,还有熟悉的十进制。
八进制和十六进制,顾名思义,分别以0-7和0-9、A、B、C、D、E、F来表示。八进制以3个二进制位为一组,十六进制以4个二进制位为一组。示例如下:
二进制:00111101
八进制:0(00)7(111)5(101) 十六进制:3(0011)D(1101)
对于这几种进制表示方法,常见的问题是相互进行进制转换。一般都以二进制为基准来进行转换,比如十进制转换为十六进制,先把十进制转换为二进制,然后转换为十六进制。其他的依此类推。
对于十进制和二进制的转换,包含两种转换,即十进制 -> 二进制和二进制 -> 十进制。对于十进制到二进制,一般采用 除二取余。而二进制到十进制则简单很多,直接以2为基数,加以权重计算即可。示例如下:
十进制 –> 二进制
150 / 2 = 75, 余 0
75 / 2 = 37, 余 1
37 / 2 = 18, 余 1
18 / 2 = 9, 余 0
9 / 2 = 4, 余 1
4 / 2 = 2, 余 0
2 / 2 = 1, 余 0
1 / 2 = 0, 余 1
====
150 = 10010110
二进制 –> 十进制 10010110 = 0*2^0 + 1*2^1 + 1*2^2 + 0*2^3 + 1*2^4 + 0*2^5 + 0*2^6 + 1*2^7 = 150
其他的进制转换可以依此类推。常见的进制转换表如下所示:
十进制 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
二进制 |
0000 |
0001 |
0010 |
0011 |
0100 |
0101 |
0110 |
0111 |
1000 |
1001 |
1010 |
1011 |
1100 |
1101 |
1110 |
1111 |
八进制 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
十六进制 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
A |
B |
C |
D |
E |
F |
注意:
1. 需要熟记2的幂,即2的x次方,表示为2(x)
2(2)=4,2(3)=8,2(4)=16,2(5)=32,2(6)=64,2(7)=128,2(8)=256,2(9)=512,2(10)=1024
1.3 数据寻址
通过上面的描述,了解了计算机上信息的存储,那如何找到这些信息呢?计算机中的最小可寻址单位是字节,那数据的地址是所用字节中最小的地址。计算机将所有的存储设备抽象为一个字节数组,也就是对所有的程序来说,其看到的存储器是一个字节数组,该字节数组称为虚拟存储器。
虚拟存储器的地址大小由计算机的 字长 这个属性决定,比如常见计算机字长 32位,那么其寻址范围为2的32次方字节即4GB。
对于跨越多个字节的数据,计算机有多种存储策略,常见的有:小端法、大端法、双端法。小端法即数据的低位存储在前,大端法即数据的高位存储在前,双端法即同时支持大端和小端存储。
1.4 位级别运算
常见位级别的运算有:按位布尔运算、移位运算等。
按位布尔运算如下表所示。
a |
b |
运算 |
结果 |
1001 |
0111 |
a | b |
1111 |
1101 |
1011 |
a & b |
1001 |
1010 |
~a |
0101 |
移位运算分为:左移和右移。左移低位补0会数字变大,右移会使数字变小。右移分为逻辑右移和算术右移,逻辑右移即高位补0,算术右移即高位补最高有效位值。示例如下:
x |
操作 |
结果 |
01011010 |
x<<4 |
10100000 |
01010011 |
x>>4(逻辑右移) |
00000101 |
10100101 |
x>>4(算术右移) |
11111010 |
注意:
1. Java中 x >> k 为算术右移k位,x >>> k 为逻辑右移k位。
1.5 字符表示
对于字符串,每个字符都由一个编码表示。比如常见的有:ASCII(American Stardard Code For Information Interchange),Unicode,GB2312 等。
ASCII 使用一个字节来表示英文字符,不适合表示其他的中文、俄文等。所以提出了Unicode,使用4个字节编码字符,对于常见的编码,使用和ASCII一样的编码。
注意:Java中的字符编码使用Unicode
原文地址:https://www.cnblogs.com/glsy/p/11827322.html