文章目录

东篱南山

采菊东篱下,悠然现南山

进制转换随笔

    所有的数据都可以用二进制来表示,也就是说,计算机中所有类型的数据(图片、语音图像、可执行文件、文本文件、压缩文件等等),其实都可以用数字来表示。



    在计算机中,数字用它的二进制补码来存储和计算,

    正数的补码和它的原码相同(正数的原码、反码和补码都相同)。  

    负数的补码,先对负数的绝对值求原码,然后取反,最后+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


标题:进制转换随笔
作者:zc1249274251
地址:https://www.fanyueba.com/articles/2019/09/26/1569473708751.html