与、或、非、位移
原码、反码、补码
字节、位、超区间......
开始本章节之前,我们先思考一个问题:
byte a = 33; byte b = -3;
若我们输出a、b的二进制字符串是多少?
答案是这样的么?
a->// 00100001 b->// 10100001
当然同学们可能会觉得我既然问了就肯定不是这样;是吧~别着急你们试试就知道了。
在Java中输出一个值对应的二进制方法有很多,这里提供一个简单的方法:
int value = 33; String bs = String.format("%32s", Integer.toBinaryString(value)).replace(" ", "0");
在方法中是int值,int占4字节32位,所以是:“%32s” 若是byte将32改成8即可;当然对于byte你还需要加上**“&0xFF”**来做高位清零操作。
String bs = String.format("%8s", Integer.toBinaryString(value&0xFF)).replace(" ", "0");
基本原则
在Java中是采用的有符号的运算方式,故:高位为符号位,其余位存储数据信息。
简单来说:
+1 ->// 00000001 -1 ->// 10000001
默认例子中的值都按byte来算,占8位,减少大家的记忆负担。
因为byte占8位,所以有效数据存储7位,最高位为符号位。int值则是31位存储数据。
0 代表正数
1 代表负数
上述的-1的表示方法其实并不是机器码,而是人脑的理解方式。
我们认为+1与-1的差异就是高位不同而已,这是我们基于自然规律来看的;而机器真正存储的值其实是:11111111;这里其实就给大家提到了最初的问题。
二进制的计算规则是:逢2进1
这个很好理解,因为表示的数字就是:0、1两个数字,想要表示更大的值就只能往前递增进步。
在平时生活中是逢10进1;因为咱们有10个数字:9、8、7、6、5、4、3、2、1、0;所以11就是:当为0|9增加为10的时候就进一格所以变成:1|0,个位再把剩余的1补上就是:1|1;所以就是11。
那么:
1就是:0|0|0|0|0|0|0|1 2就是:0|0|0|0|0|0|1|0 3就是:0|0|0|0|0|0|1|1 4就是:0|0|0|0|0|1|0|0
运算法则
设
byte a = (byte) 0b01011000; // 88 byte b = (byte) 0b10101000; // -88 int n = 1;
按位与 a & b
输入2个参数
a、b对应位都为1时,c对应位为1;反之为0。
按位或 a | b**
输入2个参数 a、b对应位只要有一个为1,c对应位就为1;反之为0。
按位异或 a^b
输入2个参数 a、b对应位只要不同,则c对应位就为1;反之为0。
按位取反(非)
输入1个参数 c对应位与输入参数a完全相反;a对应位为1,则c对应位就为0;a对应位为0,则c对应位就为1。
左移