二进制

    技术2022-07-11  78

    这里写目录标题

    二进制

    二进制

    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 */ } ​ }

    补码互补对称:

    Processed: 0.011, SQL: 9