十进制转二进制("除2取余,逆序排列"法)
概念
原码:
一个正数,按照绝对值大小转换成的二进制数;一个负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。
正数与负数二进制表示的区别就在于最高位,最高位1表示负数,最高位0表示正数。
反码: 正数的反码与原码相同,负数的反码为对该数的原码除符号位(最高位/最右的位)外各位取反,1变0; 0变1。
举例:8的二进制(假如2字节)表示:00001000,反码也是00001000。-8的二进制(假如2字节)表示:10001000(就是将8的二进制最高位置为1,所以负数二进制非常简单),反码是11110111。
补码: 正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1,也就是对反码最后一位加1,
-8的原码:10001000,反码是11110111,补码就是:11111000。
官方解释:
①原码表示法规定:用符号位和数值表示带符号数,正数的符号位用“0”表示,负数的符号位用“1”表示,数值部分用二进制形式表示。
②反码表示法规定:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。
③补码表示法规定:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.
④正零和负零的补码相同,[+0]补=[-0]补=0000 0000B。
正数转换
十进制转二进制:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
举例:8转二进制,8/2结果商4余0(记录起来),4(商)/2结果商2余0(记录起来),2(商)/2结果商1余0(记录起来),1(商)/2结果商0余1(记录起来),商小于1结束,倒序排列余数1000即8的二进制。
负数转换
负数的二进制表示用的是补码。举例-15转二进制:
15的二进制00001111,则-15二进制原码10001111,-15二进制反码:11110000,-15二进制补码:11110001,最终-15二进制表示为11110001。
如果根据11110001二进制转换十进制,步骤:1.最高位为1则是负数,转为反码11110000,转原码10001111,转十进制-(1x2的3次方+1x2的2次方+1x2的1次方+1x2的0次方)= -15。
java基本数据类型取值范围推算
以int类型为例子,其余举一反三
int类型的长度为4字节,也就是4x8=32个bit位。
a. 如果最高位为1也就是表示的负数,范围(10……0至11……1)
,如果最高位为0也就是表示的正数范围(00……0至01……1)。
b. 000000000……000是正数的最小值也就是0,同理0111111……111是正数的最大值也就是2的31次方-1,从2的0次方一直加到2的30次方=2的31次方-1,此为数学公式。
由此得出int类型的取值范围正数是从0至2的31次方-1.
c. 负数的取值范围有点意思,32位的10000……000000(这是补码),如果求反码即减一,则矛盾,所以硬性规定它就是十进制-0,也就是说在二进制中,0有两种表方法。+0的原码为0000 0000 0000 0000 0000 0000 0000 0000,-0的原码为1000 0000 0000 0000 0000 0000 0000 0000,因为0只需要一个,所以把-0拿来当做一个最小的数-2的31次方也就是-2147483648,其补码表示为1000 0000 0000 0000 0000 0000 0000 0000,在32位没有原码。
32位的10000……000001(此为补码–负数二进制用补码表示),求反码10000……000000,求原码11111……111111也就是-(2的31次方-1)。
32位的111…11…1111(最高位1为负数,此为负数补码因为负数二进制用补码表示,不用原码,原码用于计算),求反码1111…11…1110,求原码1000…000…0001也就是-(1x2的0次方)= -1
总结
java int类型的取值范围是 (-2^31) ~ (2^31-1),总共 2^32个数,int类型占用32bit位,恰好是二进制 2^32 种排列组合。
二进制转十进制方法(“按权相加”法)
二进制转为十进制要从右到左用二进制的每个数去乘以2的相应次方(当前数的下标次方,下标从0开始)。
1010转十进制方法:1010各个数下标分别为3210,这个下标就是接下来的2的对应次幂。
1010十进制=1x2^3 + 0x2^2 + 1x2^1 + 0x2^0=10