所有的数据都可以用二进制来表示,也就是说,计算机中所有类型的数据(图片、语音图像、可执行文件、文本文件、压缩文件等等),其实都可以用数字来表示。
在计算机中,数字用它的二进制补码来存储和计算,
正数的补码和它的原码相同(正数的原码、反码和补码都相同)。
负数的补码,先对负数的绝对值求原码,然后取反,最后+1
负数的补码 = 该数的二进制反码 + 1
正数的符号位是0,负数的符号位是1。
用int型数字“2”和“-2”来说,二进制数字表示:
正数2的二进制:0000 0000,0000 0000,0000 0000,0000 0010
负数2的二进制:1111 1111,1111 1111,1111 1111,1111 1101
十进制负数转二进制求取方法:
1.先将-2绝对值求源码 也就是0000 0000,0000 0000,0000 0000,0000 0010
2.将所得源码取反 也就是 1111 1111,1111 1111,1111 1111,1111 1101
3.将所得值+1 就是最终结果 1111 1111,1111 1111,1111 1111,1111 1110
二进制负数转十进制求取方法:
B1111 1110(-2)
转成十进制步骤:
1.先将二进制负数取反 0000 0001
2.加1
3.0000 0010 就是2 然后加上负号
二进制转16进制,就是将4位合成一位
2转成16进制 0x0000,0002
-2转成16进制 0xFFFF,FFFE
16进制转10进制 0xC1AA =1216^3+116^2+1016^1+1016^0
二进制的位移操作:
** 1.左移操作(<<) **
** 左移的规则只记住一点:丢弃最高位,0补最低位**
** int 3左移2位 3<<2 **
** 移动前:0000 0000,0000 0000,0000 0000,0000 0011
**
** 移动后:00 0000,0000 0000,0000 0000,0000 001100
**
** 2.右移操作(>>)
**
** 右移的规则只记住一点:符号位不变,左边补上符号位**
** int 3 右移2位 3>>2
**
** 移动前:0000 0000,0000 0000,0000 0000,0000 0011**
** 移动后:00,0000 0000,0000 0000,0000 0000,00 **
** int -3 右移2位 -3>>2
**
** 移动前:1111 1111,1111 1111,1111 1111,1111 1101
**
** 移动后:11 1111 1111,1111 1111,1111 1111,1111 11**
** 3.无符号右移(>>>)**
** 无符号右移的规则只记住一点:忽略了符号位扩展,0补最高位
**
** 无符号右移运算符>>> 只是对32位和64位的值有意义**
** int 3 无符号右移2位 3>>>2
**
** 移动前:0000 0000,0000 0000,0000 0000,0000 0011**
** 移动后:00 0000 0000,0000 0000,0000 0000,0000 00**
二进制-------------------------------十进制------------------------十六进制
1111 8+4+2+1=15 0xF
高八位 16进制而言 0000 1111 1111 1111 0000 1111 代表高八位 1111 1111 第八位
正数右移,高位用0补,负数右移,高位用1补,当负数使用无符号右移时,用0进行部位(自然而然的,就由负数变成了正数了)
十进制负数转二进制,1.绝对值求二进制数 2. 取反 3.末位加1
byte b = byteBuffer.get();
boolean fin = (b & 0x80) > 0;
int rsv = ((b & 0x70) >>> 4);
byte opCode = (byte) (b & 0xF);
fin(1位) b&0x80(1000 0000)是取出byte[0]的最高位 它只会是0或者1 跟0 比较就是boolean值
rsv(分别是rsv1,2,3 共三位) b&0x70(0111 0000)是取出byte第二,三,四位
opcode(4位)opcode是标识数据类型的 b&0xF(0000 1111)是取出后四位判断操作
其中fin 分片传输分为三个部分:
开始帧:FIN=0,Opcode>0;一个
传输帧:FIN=0,Opcode=0;零个或多个
终止帧:FIN=1,Opcode=0;一个
把number转换为二进制,只取最低的8位(bit)。因为0xff二进制就是1111 1111
&运算是,如果对应的两个bit都是1,则那个bit结果为1,否则为0.
比如 1010 & 1101 = 1000 (二进制)
由于0xff最低的8位是1,因此number中低8位中的&之后,
如果原来是1,结果还是1,原来是0,结果位还是0.高于8位的,0xff都是0,
所以无论是0还是1,结果都是0.
number如果为 0xabcd, 那么number & 0xff = number & 0x00ff = 0x00cd = 0xcd
16进制表
0------------------------0
1------------------------1
2-------------------------2
3-------------------------3
4------------------------4
5-------------------------5
6-------------------------6
7-------------------------7
8-------------------------8
9-------------------------9
10------------------------A
11-------------------------B
12------------------------C
13------------------------D
14------------------------E
15------------------------F