进制转换和位运算符
前言
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