1.1 进制介绍
进制也就是进位计数制,是人为定义的带进位的计数方法。 对于任何一种进制---X进制,就表示每一位置上的数运算时都是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。
Java中常量的四种表现形式
二进制的数据表现形式
由0,1组成,以0b开头(jdk7版本开始的,b可大写)。
八进制的数据表现形式
由0,1…7组成,以0开头。
十进制数据表现形式
由0,1…9组成,整数默认是十进制的。
十六进制数据表现形式
由0,1…9,a,b,c,d,e,f(大小写均可)。 以0x开头(x可大写)
案例
public static void main(String[] args){
System.out.println(0b10);
System.out.println(010);
System.out.println(10);
System.out.println(0x10);
}
1.2 二进制
计算机的底层都是二进制
在计算机中采用二进制数表示各种信息数据,进行运算,主要是因为二进制本身具有一些独特的优点如:运算简单、表示方便、转换方便、可靠性高等。 1 表示方便 二进制只有两个数码0、1,计算机中非常容易表示电子元器件、电子下路、磁芯等物理不见的两种不同的物理状态表示。如晶体管的导通与截止,电容的充电和放点,开关的接通与断开,电流的有与无,灯的亮与灭,磁芯磁化极性的不同等两个截然不同的对立状态都可用于表示二进制数。将多个器件排列起来,就可表示多位二进制数。 如果采用十进制,则需要在硬件上实现十个稳定的物理状态,来表示从 0~9 的 10 个数码,这是非常困难的。 2 运算简单 二进制的运算法则比较简单,如二进制的加法运算法则只有四条: 0+0=0 0+1=1 1+0=1 1+1=10(逢二进一),而十进制的加法运算法则有100条。另外,二进制数的乘、除法运算只需要通过加法运算和移位操作就可以完成,这比十进制数的乘、除法运算要简便得多,据此设计的计算机运算器硬件结构大为简化,也为计算机软件的设计带来很大方便。 3 逻辑运算 逻辑代数又称布尔代数,是计算机逻辑电路设计的重要理论工具和二值逻辑运算的理论基础。二进制的两个数码 0 和 1 正好与逻辑代数中的真(True)和假(False)相对应,所以采用二进制,既便于使用逻辑代数的方法去设计和简化计算机的各种逻辑电路,也可以在计算机中根据二值逻辑进行逻辑运算。 4 可靠性高 二进制数只有 0 和 1 两个基本数码,在存储、传输和处理时不容易出错,可靠性高。 5 转换方便 计算机使用二进制,人们习惯于使用十进制。而二进制与十进制间的转换很方便,二进制与八进制、十六进制的转换也很简单,因此使人与计算机间的信息交流既简便又容易。
如何用0和1表示数据
两种状态位表示数据只能表示四种类型数据: 用1表示开,0表示关,开开(11),关关(00),开关(10),关开(01)。 四种状态位根本不够表达所有的数据(字母、字符、数字等),国际化组织规定用8个状态位来表示一个数据,单位:一个字节byte(8bit),字节也是计算机中最小的存储单位。
单位:
1byte = 8bit(比特位)1字节 1k = 1024byte 1k 1m = 1024k 1m 1G = 1024m 1G 1T = 1024G 1T
八进制与十六进制
我们看到的所有数据底层都是二进制表示如:图像、视频、文字等,如果未经过转换将看到的是一堆1110101....二进制数码。 二进制数码随着数据越大状态位会不断增长,表现形式极长不够友好,科学家们基于二进制基础上进行一定规律优化后得到八进制和十六进制,优化后进制变得越大表现形式会变得越短。
八进制
将二进制从右往左,3个2进制数码分一组,如果不够用0补齐。计算出每一组2进制数据的10进制结果,再将这几组结果拼接起来就是8进制。 10010111 010 010 111 ----- ----- ----- 10进制结果 10进制结果 10进制结果 --------------------------------------- 2 2 7 三组10进制结果拼接起来就是8进制 0 227
十六进制
将二进制从右往左,4个2进制数码分一组,如果不够用0补齐。计算出每一组2进制数据的10进制结果,再将这几组结果拼接起来就是16进制。 10010111 1001 0111 ------- ------ 10进制结果 10进制结果 ------------------------------------ 9 7 两组10进制结果拼接起来就是16进制 0x97
1.3 任意进制到十进制转换
三要素
数位、基数、位权
数位:
“数位”是指一个数的每个数字所占的位置。数位顺序表从右端算起,第一位是“个位”,第二位是“十位”,第三位是“百位”,第四位是“千位”,第五位是“万位”,等等。同一个数字,由于所在的数位不同,它所表示的数值也就不同。例如,在用阿拉伯数字表示数时,同一个‘6’,放在十位上表示6个十,放在百位上表示6个百,放在亿位上表示6个亿等等。
基数:
基数是指在某种进位计数制中,每个数位上所能使用的数码的个数。 二进制: 二进制两个数码(0,1),基数为2 八进制: 八进制包含8个数码(0,1,2,3,4,5,6,7),基数为8 十进制: 十进制包含10个数码(0~9),基数为10 十六进制: 十六进制包含16个数码(0~9、A~F),基数为16 例: 10进制转换为其他进制,基数为10,2进制转换为其他进制基数为2,其他进制同理。
位权:
又称权,数码所在的位置的加权值,可以理解为权重,倍率。 例如: 从右往左,从零开始。二进制第2位的位权为1,第3位的位权为2。 简单的可理解为是对每一个位上的数进行编号,编号是从右往左,从0开始。 二进制:111001 对应权:543210
计算公式
数位的值 * 基数 ^ 权 注: ^表示基数的幂次,幂的次数去却与权的大小。
十进制到十进制的转换
10进制数8848转换为10进制 8848 = 8000 + 800 + 40 + 8 = 8*10^3 + 8*10^2 + 4*10^1 + 8*10^0 = 8000 + 800 + 40 + 8 = 8848 10进制12345转换为10进制 12345 = 10000 + 2000 + 300 + 40 + 5 = 1*10^4 + 2*10^3 + 3*10^2 + 4*10^1 + 5*10^0 = 10000 + 2000 + 300 + 40 + 5 = 12345
二进制到十进制之间的转换
2进制数0b100转换为10进制 0b100 = 1*2^2 + 0*2^1 + 0*2^0 = 4 + 0 + 0 = 4
八进制到十进制之间的转换
8进制数0100转换为10进制 0100 = 1*8^2 + 0*8^1 + 0*8^0 = 64 + 0 + 0 = 64
十六进制到十进制之间的转换
16进制数值0x100到10进制之间的转换 0x100 = 1*16^2 + 0*16^1 + 0*16^0 = 256 + 0 + 0 = 256
1.4 十进制到任意进制之间的转换
10进制到任意进制之间的转换方式,除基取余直到商为0,余数反转。
十进制转为十进制
10进制数8848转换为10进制 8848 除 10 = 884 余 8 884 除 10 = 88 余 4 88 除 10 = 8 余 8 8 除 10 = 0 余 8 ------------------------------- 余数反转 = 8848
十进制到二进制之间的转换
10进制数100转换为2进制 100 除 2 = 50 余 0 50 除 2 = 25 余 0 25 除 2 = 12 余 1 12 除 2 = 6 余 0 6 除 2 = 3 余 0 3 除 2 = 1 余 1 1 除 2 = 0 余 1 ------------------------------- 余数反转 = 1100100
十进制到八进制之间的转换
10进制数100转换为8进制 100 除 8 = 12 余 4 12 除 8 = 1 余 4 1 除 8 = 0 余 1 ------------------------------- 余数反转 = 144
十进制到十六进制之间的转换
10进制数100转换为16进制 100 除 16 = 6 余 4 6 除 16 = 0 余 6 ------------------------------- 余数反转 = 64
1.5 快速转换法
8421码又称为BCD码,是十进制代码中最常用的一种。在这种编码方式中,每一位二值代码的“1”都代表一个固定数值。将每位“1”所代表的二进制数加起来就可以得到它所代表的十进制数字。
快速转换表
..... | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
---|---|---|---|---|---|---|---|---|
..... | 2^7 | 2^6 | 2^5 | 2^4 | 2^3 | 2^2 | 2^1 | 2^0 |
...... | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
二进制和十进制相互快速转换
2进制数0b1010100转换为10进制 0+0+4+0+16+0+64 = 84 10进制数100转换为2进制 100-64-32-4=0 100 - 64 = 36 36 - 32 = 4 4 - 4 = 0 = 0b1100100
二进制快速转化为八进制
2进制数0b100110转换为10进制 100 110 = 4 6 = 046
二进制快速转换为十六进制
2进制数0b00100110转换为16进制 0010 0110 = 2 6 = 0x26
1.6 有符号数据表示法
计算机中有符号数据表示法三种:原码、反码、补码。 在计算机中是用补码方式进行存储及用补码进行运算,补码可以让同一套电路即可表示正数和负数以及解决负数运算等问题。 正数:原码、反码、补码相同 负数:原码符号位为1,反码是符号位不变对数值位进行逐个取反,补码是符号位不变在反码的末尾加1
原码
二进制的左边为高位,右边为低位 二进制最高位作为符号位,0表示正数、1表示负数。 案例:原码表示正7和负7 十进制7的二进制111 符号位 数值位 +7 0 0000111 -7 1 0000111
反码
原码: 符号位 数值位 +7 0 0000111 -7 1 0000111 反码:(正数反码和原码一致,负数符号位不变,数值位按位取反) +7 0 0000111 -7 1 1111000
补码
原码: 符号位 数值位 +7 0 0000111 -7 1 0000111 反码: +7 0 0000111 -7 1 1111000 补码:(正数补码和原码一致,负数在反码的末尾加1) +7 0 0000111 -7 1 1111001 给你一段补码,求补码的十进制。 补码: 1 1111001 - 0 0000001 ———————————————— 反码: 1 1111000 ———————————————— 原码: 1 0000111
案例
求十进制-127的补码
127的二进制:1111111 -127 1 1111111 原码: 1 1111111 反码: 1 0000000 加一: 0 0000001 --------------- 1 0000001求补码0b10000010的原码
补码: 1 0000010 减一: 0 0000001 --------------- 反码 1 0000001 --------------- 原码 1 1111110