二进制

这里写目录标题

二进制

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

补码互补对称:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值