数据的表示(二)——进制
司空见惯的十进制:
大数据构想:
不管是int类型还是long类型都有自己的数据范围,如果超出这个范围数据就会出错(如过大变为负数),因此需要设计一个能处理大整数的类。
我们很容易想到用数组来表示大整数的各位,由于数组元素的多少只受计算机内存的限制,因此,就可以处理任意长度的大整数了。只受
这个数组只是大整数的一个表现形式,要处理大整数,还需要记录数据的正负、加减时的进位等。定义如下操作:
加法》将整数从个位开始进行累加,累加时还需判断是否要进位(逢十进一),因此在累加时还需要将进位数进行累加。
减法》将整数从个位开始进行减法操作,若不够减还需要从前一位借位(借一当十)。被减数在进行减法操作时还需要减去被节前的位
乘法》可将乘数中的每一个数组元素与被乘数相乘,然后将结果累加
除法》除法比较麻烦,首先要考虑试商的问题,从被除数的高位开始与除数对齐,试商时用被除数的部分减去除数,判断能减几次,就可商几,另外还需要考虑余数的问题
(有幸的是在微软的.NET Framework 4(以及JAVA的JDK 1.5)中已经提供了一个大数据类型,可以处理任意长度的大整数)
为啥要用二进制:
人脑对很多事物都形成了条件反射,如10和9的大小一眼就能看出,但要比较99999999999和10000000000的大小,要一眼看出就不大可能了
但计算机却不一样,对于任何操作,电脑都要经过运算,得出结果,不管是10和9还是9999999999和10000000000相比,电脑都会严格按算法运算
我们知道电脑中使用二进制来保存数据和编写程序,为什么要选二进制而不选我们人类熟悉的十进制呢?
如果要让电脑使用十进制,首先,应该能让电脑识别出十进制的10个数字,怎么识别呢?通常考虑,可以通过元器件中电压的高低水平来分别10个数字
假如最高电压为12V,那么10个数字中,每个数码可以分配的电压区间为1.33V,而每个数之间的电压间隔越小,外界干扰影响就越大,另外在硬件上要识别这10种状态,其电路结构将非常复杂
而使用二进制就电路就很简单了,因为具有两种稳定状态的元件(如晶体管的导通截止,继电器的接通断开,电脉冲电平的高低等)很容易被找到
△因此二进制有如下优点:
1>技术实现简单。电脑由逻辑电路组成,逻辑电路通常只有两种状态,开关的接通和断开,这两种状态正好可以用1和0表示
2>运算规则简单。两个二进制的和、积运算组合分别有3种规则,相比十进制81种,有利于简化计算机内部结构,提高运算速度
3>适合逻辑运算。逻辑代数是逻辑运算的理论依据,二进制只有两个数码,正好与逻辑代数的“真”和“假”相吻合
4>易于进行转换。二进制数与十进制数、八进制数、十六进制之间的转换很方便
5>抗干扰能力强。用二进制表示数据具有抗干扰能力强,可靠性高等优点。
其它常见进制表示(此处不详细介绍):
八进制(神奇的八卦):0,1,2,3,4,5,6,7
十二进制(钟表的十二):0,1,2,3,4,5,6,7,8,9,A,B
十六进制(半斤八两):0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
六十进制(60年一个甲子)
补充—进制间小数的转换
小数的转换我们采用乘r取整法:
如193.12转换为八进制,
(193)D可换为(301)O,
而0.12则有,
0.12×8=0.96 ------0
0.96×8=7.68 ------7
0.68×8=5.44 ------5
<以此类推直到没有小数>
因此(193.12)D ≈(301.075)O
补充—进制的字母表示
二进制 B Binary
八进制 O Octal
十进制 D Decimal
十六进制 H Hexadecimal