二进制 与 字节Binary and Bits
进制
进制表格
2 进制 | 10 进制 | 16 进制 |
---|---|---|
0 | 0 | 0 |
1 | 1 | 1 |
10 | 2 | 2 |
11 | 3 | 3 |
100 | 4 | 4 |
101 | 5 | 5 |
110 | 6 | 6 |
111 | 7 | 7 |
1000 | 8 | 8 |
1001 | 9 | 9 |
1010 | 10 | A |
1011 | 11 | B |
1100 | 12 | C |
1101 | 13 | D |
1110 | 14 | E |
1111 | 15 | F |
10000 | 16 | 10 |
10001 | 17 | 11 |
应用场景
二进制
硬件相关,变量存储
十六进制
颜色值
#FF0000
进制转换
2 转 10
1011 ^ 2^0 = 1 ^ 2^1 = 2 ^ 2^3 = 8 + ----- = 11
整型进制字面量
1 2 3 4 int binary = 0b1011;int hex = 0xD;Console.println(binary);Console.println(hex);
整型打印时,永远会按着 10 进制进行打印
进制转换 API
int 转 二进制 String
1 2 3 <int binary = 11;String string = Integer.toBinaryString(binary);Console.println(string);1011
二进制 String 转 int
1 2 3 <String string = "1011";int binary = Integer.parseInt(string, 2);Console.println(binary);11
int 转 十六进制 String
1 2 3 <int hex = 11;String string = Integer.toHexString(hex);Console.println(string);b
十六进制 String 转 int
1 2 3 <String string = "B";int hex = Integer.parseInt(string, 16);Console.println(hex);11
二进制表达整数
数据容量单位
英文 | 中文 | 大小 |
---|---|---|
bit | 位 / 比特 | 1/0 |
byte / b | 字节 | 8 个 bit |
1 kb = 2^10 byte = 1024 byte ~= 1000 byte
4 bits 能表达多少种可能
2^4 = 16
4 bytes 能表达多少种可能
2^(4*8) = 2^32
1 个 16 进制 能表达多少种可能
16
1 个 byte 是多少个十六进制?
2^8 / 16 = 2
无符号整型Unsigned Integer
按顺序表达
如果现在有 4 位,我们按顺序表达十进制整数
0000 0 0001 1 0010 2 ... 0110 6 0111 7 1000 8 1001 9 ... 1110 14 1111 15 1 0000 0
那么 4 位 可以表达 0 ~ 15, 也就是 0 ~ 2^4-1 范围内的整数
有符号整型Singed Integer
思路
1.
留一半给负数
2.
-1 + 1 = 0
分叉表达
0000 0 1111 -1 0001 1 1110 -2 0010 2 1101 -3 ... ... 0110 6 1001 -7 0111 7 1000 -8
那么 4 位 可以表达 -8 ~ 7, 也就是 2^3 ~ 2^3-1 范围内的整数
符号位
我们管 有符号整型的 第一位 叫做符号位
java 中的整数的数据类型
类型 | bytes | bits | 符号分配 | 范围 |
---|---|---|---|---|
byte | 1 | 8 | 有符号 | -128 ~ 127 |
short | 2 | 16 | 有符号 | -32,768 ~ 32,767 |
char | 2 | 16 | 无符号 | 0x0000 ~ 0xffff |
int | 4 | 32 | 有符号 | -2,147,483,648 ~ 2,147,483,647 也就是 10^9 左右 |
long | 8 | 64 | 有符号 | -2^63 ~ 2^63-1 |
补充
long
写 long 的字面量时,后面要追加 L/l,代表所生成的整数不是 int 类型,而是 long 类型
从而能写更长的字面量值
1 long v = 100000000000L;
字面量内的下划线
字面量内可以增加下划线,不影响值,但可读性会增强
1 long v = 100_000_000_000L;
float
float 是另外一个表达小数的类型,能表达的范围和精度 都比 double 要小
写字面量时,后面要追加 F/f,表达所生成的小数不是 double 类型,而是 float 类型
1 float f = 0.21f;
数据溢出Overflow
原因
0111 7 1 1 + --------- 1000 -8
现象
1 2 3 int v = Integer.MAX_VALUE;v++;Console.println(v);
运算规则
为了保护数据不被丢失,int 以下尺寸的任何数据类型,进行数学计算时,自动变为 int 类型
1 2 3!4 short s1 = 1;short s2 = 1;short sum = s1 + s2;short sum2 = s2 + s2;
位运算Bitwise Operators
& 运算符
且:都是 1
1 2 3 =int a = 0b1101;int b = 0b0100;int x = a & b;0b0100
| 运算符
或: 有一个1
1 2 3 =int a = 0b1101;int b = 0b0100;int x = a | b;0b1101
& 与 && 对比
&& 有断义, & 没有
1 2 3 4 boolean a = false;boolean b = true;boolean c = a && b;boolean d = a & b;
^ 运算符
异或: 不一样
1 2 3 =int a = 0b1101;int b = 0b0100;int x = a ^ b;0b1001
~ 运算符
反
1 2 =int a = 0b1101;int x = ~a;0010
使用异或运算符实现数据对称加密
原理
A ^ B ^ B = A
错位运算Bit Shift Operators
<< 运算符
向左错位, 右侧补 0
1 2 =int a = 0b1101;int x = a << 1;11010
符号位会被错走
1011 1111 << 1 0111 1110
>> 运算符
向右错位, 左侧补符号位
1 2 =int a = 0b1101;int x = a >> 1;110
符号位会被保留
1011 1111 >> 1 1101 1111
>>> 运算符
向右错位, 左侧补 0
1 2 =int a = 0b1101;int x = a >> 1;110
符号位会被错走
1011 1111 >>> 1 0101 1111