计算机的信息存储和逻辑计算的元数据,因为计算机是由晶体管、电路板组装成的电子设备。生活忠的十进制是"逢十进一",同理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);