二进制与十进制的关系和转化
搞了这么久的程序,还是对进制和转化一知半解,曾也在这上面栽了几回,今天就狠下心好好研究下吧:
?
1. 二进制表示:
形如:0000 0001
每一位称为一个bit位,有多少个bit位,这个二进制数就有几位。如该数有8个bit位。
?
2. 数据类型与二进制位数:
1 个字节 ? 有 ? ?8 个bit位 ? ??即: 1Byte ?= 8bit
1 个字 ? ? ?有 ? ?2 个字节 ? ? ?即: 1Word = 2Byte = 16bit
?
Java中的整数类型:
short ? ? ? 有 ? ?2个字节 ? ? ? 即: 1short = 2Byte = 16bit
int ? ? ? ? ? 有 ? ?4个字节 ? ? ? 即: ?1int ? ?= 4Byte = 32bit
long? ? ? ? 有 ? ?8个字节 ? ? ? 即: ?1long ?= 8Byte = 64bit
?
2'. 容量与二进制位数:
1KB = 1024 Byte = 1024 * 8 bit = 1024 个字 = 1024 short = 512 int = 256 long
?
3. 二进制与十进制的关系:
以一个short型(16bit)为例:
?
二进制:0001 0101 = 2^0 + 2^2 + 2^4 = 21 : 十进制
?
4. 二进制的负数表示:
对于每类型的数据,使用其bit位的最高位来表示符号,最高位为1表示负数,0为正数。如short的第8位,int的第32位,long的第64位。
?
以一个short型(16bit)为例:
十进制数:21 ?= 二进制数:0001 0101 ?--- 那么 -21如何表示?
先对21的二进制数取反 ? ? : 1110 1010
再+1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? : 1110 1011 ?----这就是-21.
?
? ? ? ? 对于一个一进制数 ? ? ? ? ? ?:1110 0111 ?----这是一个负数,那它是负几呢?
可以使用上面方法的逆向方法,但也可以使用同样的方式(二进制就是这么巧妙)
取反 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?:0001 1000
再+1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? :0001 1001 ?----- 2^0 + 2^3 + 2^4 = 25, 所以原来的数为-25.
?
5. 数据类型的表示范围:
?以short为例:
short共8bit,其中最高位(第8位)用来表示符号,所以
其正数范围为 0 ~ (2^0 + 2^1 + 2^2 + ... + 2^6) = 2^7 - 1。
也可以这样理解,用7个bit位来表示数值(第8位用来表示符号),排列可能数为 2^7,0为其中的一个可能,所以范转为 0 ~ 2^7-1 即 0 ~ 127
?
其负数范围为 -1 ~ - (2 ^ 7) 即 -1~-128
为什么不是-127呢,还是向上面一样理解,用7个bit位来表示数值(第8位用来表示符号),排列可能数为 2^7,但是与正数不同的是,这里不需要抽一种可能来表示0,而是直接从-1开始,共128种可能,即到-128.
?
所以总结为:short类型的数值范围为 -128 ~ 127,其中负数范围为 -128 ~ -1 (共128个数),正数范围为 0 ~ 127 (共128个数)
?
同理:
int?:?-(2^15) ~ 2^15 -1
long ?: -(2^63) ~ 2^63 -1
?
?
待续: java中的类型转换补位,纯二进制转换,二进制移位操作, java的二进制使用BitSet