0与1的世界

计算机的信息存储和逻辑计算的元数据,因为计算机是由晶体管、电路板组装成的电子设备。生活忠的十进制是"逢十进一",同理0 1表示大于1的数字是"逢二进一",1,2,3,4用二进制表示如果是4电路的话分别是0001,0010,0011,0100。

负数表示

那么负数怎么表示?规定电路的最左侧一位0表示正数1表示负数,所以8电路的表示范围-1280127。

补码

为了使减法运算也能使用加法器实现,符号位也能参与运算,二进制最终都以补码的形式出现。正数的原码、补码、反码都一样。负数的补码是反码加1。比如-5的二进制是1101,反码是1010,补码是1011。

移位

移位最常的用法是高低位的截取(int转byte[4]),移位的具体做法是补码带符号移动空位用0补上,负数右移高位补1。
在这里插入图片描述

无符号右移

无符号右移,向右移动不用像符号右移一样需要给高位补1,正数不断右移最小值是0,负数是1。

为啥负数最小值是1呢?在实际变成中位移存在int(32位)和long(64位)上,它们移动32位或者64位还是本身。

		int i1 = 35;
        int i2 = -35;
        long l1 = 35;
        long l2 = -35;
        System.out.println("i1 >> 32 " + (i1 >> 32));
        System.out.println("i1 >>> 32 " + (i1 >>> 32));
        System.out.println("i1 >>> 31 " + (i1 >>> 31));
        System.out.println("i1 << 32 " + (i1 << 32));
        System.out.println("i2 >> 32 " + (i2 >> 32));
        System.out.println("i2 >>> 32 " + (i2 >>> 32));
        System.out.println("i2 >>> 31 " + (i2 >>> 31));
        System.out.println("i2 << 32 " + (i2 << 32));
        System.out.println("l1 >> 64 " + (l1 >> 64));
        System.out.println("l1 >>> 64 " + (l1 >>> 64));
        System.out.println("l1 >>> 63 " + (l1 >>> 63));
        System.out.println("l1 << 64 " + (l1 << 64));
        System.out.println("l2 >> 64 " + (l2 >> 64));
        System.out.println("l2 >>> 64 " + (l2 >>> 64));
        System.out.println("l2 >>> 63 " + (l2 >>> 63));
        System.out.println("l2 << 64 " + (l2 << 64));

位运算

位运算有与(&)、或(|)、取反(~)、异或(^)等。逻辑也有与(&&)、或(||),逻辑只能操作布尔类型返回布尔类型的,布尔类型底层也是用0和1表示的。但是逻辑的是短路的,如下

        boolean a = true;
        boolean b = true;
        boolean c = (a = (1 == 2)) && (b = (1 == 2));
        System.out.println(a + " " + b);

        boolean a1 = true;
        boolean b1 = true;
        boolean c1 = (a1 = (1 == 2)) & (b1 = (1 == 2));
        System.out.println(a1 + " " + b1);

        boolean a3 = true;
        boolean b3 = false;
        boolean c3 = (a3 = (1 == 1)) || (b3 = (1 == 1));
        System.out.println(a3 + " " + b3);

        boolean a4 = true;
        boolean b4 = false;
        boolean c4 = (a4 = (1 == 1)) | (b4 = (1 == 1));
        System.out.println(a4 + " " + b4);
        
        boolean a5 = true;
        boolean b5 = false;
        boolean c5 = a5^b5 ;
        System.out.println("异或不同才是true"+c5);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值