这里写目录标题
二进制
1 什么是2进制
10进制:逢10进1的计数规则
10进制
规则:逢10进1
数字:0 1 2 3 4 5 6 7 8 9
权:万 千 百 十 个
基数:10
2进制:逢2进1的计数规则
2进制
规则:逢2进1
数字:0 1
权:128 64 32 16 8 4 2 1
基数:2
public class Demo01 {
public static void main(String[] args) {
int n = 32; //编译:100000
//n 在内存中是一个2进制的数字 100000
System.out.println(n); //100000 转换为10进制字符串 “32”之后再输出
//Java提供了API,可以显示变量在内存中的2进制数字
System.out.println(Integer.toBinaryString(n));
for(int i=0; i<100; i++) {
System.out.println(Integer.toBinaryString(i));
}
}
}
进制是普遍存在的计数规律! 计算机采用2进制的原因是因为 “成本”!
计算机的底层是2进制的!
2 16进制
16进制在计算机编程中的作用是“缩写2进制” 。
2进制书写繁琐!
16进制的基数16,正好是2进制的基数2的4次幂,所以2进制从最低位开始每4位2进制可以缩写为1位16进制。
案例:
public class Demo02 {
public static void main(String[] args) {
/*
* Java 7 开始支持2进制直接量语法 ,使用0b为开头
*/
int n = 0b110010;
System.out.println(Integer.toBinaryString(n));
/*
* 2进制书写冗长麻烦
*/
n = 0b1001_1111_1010_0000_1010_1101_0011;
System.out.println(Integer.toBinaryString(n));
/*
* 16进制作为2进制的简写, 可以简化代码!
* 凡是编码时候写2进制时,都采用16进制进行缩写
*/
//int num = 0b1010111111010010110001110101100;
int num = 0x57e963ac;
System.out.println(Integer.toBinaryString(num));
long l = 0b010_10111110_10001011_11000110_10111010_10001010L;
/*
* 以0为开头的直接量是8进制
*/
int k = 072;
System.out.println(k);
}
}
3 补码
将固定位数2进制分一半作为负数使用的一种编码!其编码目的是解决负数问题!
int 类型是32位补码,有42亿多个数
long类型是64位补码,数字非常多
不便于理论研究,因此我们课程采用4位补码作为理论研究!其规律可以推广到int、long类型。
4位补码编码规则:
计算时候始终保持4位不变,多出位数自动溢出
将高位为1的作为负数编码
采用倒推的规则为负数编码
因为这种编码互补对称,顾称为:补码!
验证int类型的编码:
public class Demo03 {
public static void main(String[] args) {
/*
* 补码的最大值
*/
int max = Integer.MAX_VALUE;
System.out.println(max); //2147483647
System.out.println(Integer.toBinaryString(max));
int min = Integer.MIN_VALUE;
System.out.println(min);
System.out.println(Integer.toBinaryString(min));
System.out.println(Integer.toBinaryString(max+1));
long lmax = Long.MAX_VALUE;
long lmin = Long.MIN_VALUE;
System.out.println(Long.toBinaryString(lmax));
System.out.println(Long.toBinaryString(lmin));
// -1 的编码:
int n = -1;
long m = -1L;
System.out.println(Integer.toBinaryString(n));
System.out.println(Long.toBinaryString(m));
//强制类型转换问题
int k = (int)lmin;
//10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
// 00000000 00000000 00000000 00000000
System.out.println(k);
}
}
计算负数补码的值:
public class Demo04 {
public static void main(String[] args) {
int n = -9;
System.out.println(Integer.toBinaryString(-1));
System.out.println(Integer.toBinaryString(n));
n = -41;
System.out.println(Integer.toBinaryString(n));
for(int i=-100; i<0; i++) {
System.out.println(Integer.toBinaryString(i));
}
/*
11111111 11111111 11111111 11111111 = -1
11111111 11111111 11111111 11110111 = -1-8 = -9
8421
11111111 11111111 11111111 11010111 = -1-8-32=-41
*/
}
}
补码互补对称: