进制转换和位运算符
前言
Github:https://github.com/HealerJean
一、字节
1、字节描述
一个字节为
8位二进制位。 字节(Byte) 是计算机信息技术用于计量存储容量的一种计量单位,也表示一些计算机编程语言中的数据类型和语言字符。 数据存储是以 “字节”(Byte)为单位,数据传输是以大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写为b)组成一个字节(Byte,简写为B),是最小一级的信息单位。
2、字节转化
- 1 字节 (B) = 8 比特 (bit)
 - 1 千字节 (KB) = 1024 字节 (B)
 - 1 兆字节 (MB) = 1024 千字节 (KB)
 - 1 吉字节 (GB) = 1024 兆字节 (MB)
 - 1 太字节 (TB) = 1024 吉字节 (GB)
 - 1 拍字节 (PB) = 1024 太字节 (TB)
 - 1 艾字节 (EB) = 1024 拍字节 (PB)
 
二、进制
1、10 进制转 2 进制

2、2 进制转 10 进制

3、2 进制换 8 进制

三、ASCII 码
控制字符:回车键、退格、换行键等。可显示字符:英文大小写字符、阿拉伯数字和西文符号
https://tool.oschina.net/commons?type=4
| ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 | 
|---|---|---|---|---|---|---|---|
| 0 | NUT | 32 | (space) | 64 | @ | 96 | 、 | 
| 1 | SOH | 33 | ! | 65 | A | 97 | a | 
| 2 | STX | 34 | ” | 66 | B | 98 | b | 
| 3 | ETX | 35 | # | 67 | C | 99 | c | 
| 4 | EOT | 36 | $ | 68 | D | 100 | d | 
| 5 | ENQ | 37 | % | 69 | E | 101 | e | 
| 6 | ACK | 38 | & | 70 | F | 102 | f | 
| 7 | BEL | 39 | , | 71 | G | 103 | g | 
| 8 | BS | 40 | ( | 72 | H | 104 | h | 
| 9 | HT | 41 | ) | 73 | I | 105 | i | 
| 10 | LF | 42 | * | 74 | J | 106 | j | 
| 11 | VT | 43 | + | 75 | K | 107 | k | 
| 12 | FF | 44 | , | 76 | L | 108 | l | 
| 13 | CR | 45 | - | 77 | M | 109 | m | 
| 14 | SO | 46 | . | 78 | N | 110 | n | 
| 15 | SI | 47 | / | 79 | O | 111 | o | 
| 16 | DLE | 48 | 0 | 80 | P | 112 | p | 
| 17 | DCI | 49 | 1 | 81 | Q | 113 | q | 
| 18 | DC2 | 50 | 2 | 82 | R | 114 | r | 
| 19 | DC3 | 51 | 3 | 83 | S | 115 | s | 
| 20 | DC4 | 52 | 4 | 84 | T | 116 | t | 
| 21 | NAK | 53 | 5 | 85 | U | 117 | u | 
| 22 | SYN | 54 | 6 | 86 | V | 118 | v | 
| 23 | TB | 55 | 7 | 87 | W | 119 | w | 
| 24 | CAN | 56 | 8 | 88 | X | 120 | x | 
| 25 | EM | 57 | 9 | 89 | Y | 121 | y | 
| 26 | SUB | 58 | : | 90 | Z | 122 | z | 
| 27 | ESC | 59 | ; | 91 | [ | 123 | { | 
| 28 | FS | 60 | < | 92 | \ | 124 | | | 
| 29 | GS | 61 | = | 93 | ] | 125 | } | 
| 30 | RS | 62 | > | 94 | ^ | 126 | ` | 
| 31 | US | 63 | ? | 95 | _ | 127 | DEL | 
四、运算符
1、位移运算符
1)左移运算符 «
int n = 10 ; //转化为二进制 1010
System.out.println(Integer.toBinaryString(n)); // 1010
// <<  左移运算符,相当于乘以 2 (二进制 加 一位)
int l = n << 1 ;  //1010 -> 10100   16 + 0 + 4 + 0 + 0 = 20 
System.out.println("n << 1 左移运算符"+l); //20
l  = n  << 2 ;    //1010 -> 101000   32 + 0 + 8 + 0 + 0 + 0 = 40 
System.out.println("n << 2 左移运算符"+l);// 40
2)右移运算符 »
  int n = 10 ; //转化为二进制 1010
  System.out.println(Integer.toBinaryString(n)); // 1010
  // >> 右移运算符 ,相当于除以 2 (二进制 减 一位)
  int  r= n >> 1 ;  //1010 -> 0101  4 + 0 + 1 = 5
  System.out.println("n >> 1 右移运算符"+r); //5
3)无符号运算符 »>
无符号位移(»>)和有符号位移(»)的区别是:
有符号位移运算时如果数字为正数时位移后在前面补 0 ,为负数时则在位移后在前面补1
int n = 10 ; //转化为二进制 1010
System.out.println(Integer.toBinaryString(n)); // 1010
100的二进制是 01100100
    无符号位移(>>>)向右移2位后为 00011001   100>>>2==25 最后结果为25
    有符号位移(>>) 向右移2位后为 00011001   100>>2==25 
//res = 20 >>> 2; 的结果与 >> 相同;
//无符号右移(忽略符号位,空位都以0补齐,不论是正数还是负数,都是补0),也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0。
  
  
2、与或非运算
1)按位与运算 & (都是1 为 1)

int s = 10 ;
int e = 8 ;
System.out.println(s+"二进制"+Integer.toBinaryString(s));
System.out.println(e+"二进制"+Integer.toBinaryString(e));
int y = s&e ;
System.out.println("& 与运算:"+s+"&"+e+"="+y+"  二进制:"+Integer.toBinaryString(y));
打印
10 二进制  1010
8  二进制  1000
& 与运算:10&8=8     二进制:1000
2)按位或运算 | (任意一个有1为1)

int s = 10 ;
int e = 8 ;
System.out.println(s+"二进制"+Integer.toBinaryString(s));
System.out.println(e+"二进制"+Integer.toBinaryString(e));
int h = s|e ;
System.out.println("| 或运算:"+s+"|"+e+"="+h+" 二进制:"+Integer.toBinaryString(h));
打印
10 二进制 1010
8  二进制 1000
| 或运算:10|8=10 二进制:1010
3)按位异或 运算 ^ (不相同为1)

int s = 10 ;
int e = 8 ;
System.out.println(s+"二进制"+Integer.toBinaryString(s));
System.out.println(e+"二进制"+Integer.toBinaryString(e));
int yh =s^e ;
//然后从高位开始比较,如果相同则为0,不相同则为1。
System.out.println("^ 异或运算:"+s+"^"+e+"="+yh+" 二进制:"+Integer.toBinaryString(yh));
打印
10 二进制 1010
8 二进制  1000
^ 异或运算:10^8=2 二进制:0010
4)按位取反 ~
int s = 10 ;
System.out.println(s+"二进制"+Integer.toBinaryString(s));
//如果没有特殊说明, Java中的数据类型默认是int,int是四个字节,就是32bit
//10 的二进制 其实 应该为 00000000 00000000 00000000 00001010
//~s 运算规则:如果位为0,结果是1,如果位为1,结果是0.
//                     11111111 11111111 11111111 11110101
原反补:
正数:原码 = 反码 = 补码
负数:反码 = 原码的所有位(符号位除外)取反
     补码 = 反码+1
  
//在Java中,所有数据的表示方法都是以补码的形式表示,正数的补码是它本身,负数的补码是其绝对值的原码取反,末尾再加1。
^ 非运算:-11 二进制:11111111111111111111111111110101  0101 可逆推 0100 1011 = 11 -> -11
    
11   
原码 1011 
取反 0100  
加1  0101   
高位设置为 1     
3、问题
1)一个字节的取值范围为什么是 -128 ~ 127 呢:
一个字节有
8位,第1位是符号位,1代表负数,0代表正数。所以一个字节:
最小正数二进制是 0000 0000=0
最大正数二进制是 0111 1111 = 64+32+16+8+4+2+1=127
(下面关于负数,不要计较第一位是不是符号位)
最小负数二进制是 1000 0000  → 减一:  ` 0111 1111 取反: 1000 0000`  = 128   所以应该为 -128
最大负数二进制是 1111 1111  → 减一:   1111 1110 取反: 0000 0001 = 1 所以应该为 - 1
如果带符号,需要用1位表示符号( 1 表示负数, 0 表示正),剩下7位表示数据. 那么表示范围是-128—127(包括-0和+0).
如果不带符号, 8 位全部表示数据, 那么表示范围是 0–256

  
  

