java开发入门学习三-二进制与其他进制
常见的进制
常用的进制有二进制,八进制,十进制,十六进制。而我们最熟悉的是十进制,他们分别是怎么表达的呢?
定义不同的进制,写法不同
- 二进制(Binary):
- 使用前缀
0b
或0B
。 - 例如:
int binaryNumber = 0b1010;
表示二进制的1010
,等价于十进制的10
。
- 使用前缀
- 十进制(Decimal):
- 十进制数是Java中的默认数制,因此不需要前缀。
- 例如:
int decimalNumber = 10;
表示十进制的10
。
- 八进制(Octal):
- 使用前缀
0
。 - 注意:这里只使用一个
0
作为前缀,与十六进制和二进制不同。 - 例如:
int octalNumber = 012;
表示八进制的12
,等价于十进制的10
。
- 使用前缀
- 十六进制(Hexadecimal):
- 使用前缀
0x
或0X
。 - 例如:
int hexNumber = 0xA;
表示十六进制的A
,等价于十进制的10
。
- 使用前缀
public class Main {public static void main(String[] args) {// 代码中定义的进制,无论如何在输出都是以十进制的方式输出// 二进制int binaryNumber = 0b1010;System.out.println("二进制 0b1010 等于十进制 " + binaryNumber);// 十进制int decimalNumber = 10;System.out.println("十进制 " + decimalNumber + " 等于十进制 " + decimalNumber); // 显然这里输出的是相同的数// 八进制int octalNumber = 012;System.out.println("八进制 012 等于十进制 " + octalNumber);// 十六进制int hexNumber = 0xA;System.out.println("十六进制 0xA 等于十进制 " + hexNumber);}
}
计算机底层存储
计算机存储数据,在底层是以二进制进行存储。他们都是以数据的补码进行存储,且最高位是符号位
- 正数: 最高位是0
- 负数:最高位是1
规定:
- 正数的补码,反码与原码是一样的,称为三码合一
- 负数的补码和反码,原码不一样
- 负数的原码: 十进制转二进制,且最高位为1
- 负数的反码:在原码的基础上,最高位不变,其余取反(0->1, 1->0)
- 负数的补码: 反码 + 1
有了以上规则,让我们来看几个例子;
byte b1 = 2;
byte b2 = -2;
这两个十进制在计算机是怎么存储的呢?
对于:byte存储为1个字节,8个bit,
b1 正数最高位为0;2转为二进制:10;原码 = 反码 = 补码; 因此计算机存储2 就是按照以下存储
b2 为负数,最高位是1;
进制之间的转换
二进制转10进制
二进制转10进制,除开最高位为符号位,其他一次为 位数 * 2的n次方
十进制转二进制
做除法在取余数取反
其他进制之间的转换
八进制转二进制与二转十
将数字拆分为单个数字,1个数字代表2进制的3位数;
十六转二和二转十六
将数字拆分为单个数字,1个数字代表2进制的4位数字,同上就不做案例了