前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

一、字节

1、字节描述

一个字节为 8 位二进制位。 字节( Byte ) 是计算机信息技术用于计量存储容量的一种计量单位,也表示一些计算机编程语言中的数据类型和语言字符。 数据存储是以 “字节”( Byte )为单位,数据传输是以大多是以“位”( bit ,又名“比特”)为单位,一个位就代表一个 01(即二进制),每 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 进制

1556161256797

2、2 进制转 10 进制

1556161307639

3、2 进制换 8 进制

1556161335515

三、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)

1556163357205

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)

1556163341678

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)

1556163305625

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

ContactAuthor