二进制 与 字节Binary and Bits

进制

进制表格

2 进制10 进制16 进制
000
111
1022
1133
10044
10155
11066
11177
100088
100199
101010A
101111B
110012C
110113D
111014E
111115F
100001610
100011711

应用场景

二进制

硬件相关,变量存储

十六进制

颜色值

#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 中的整数的数据类型

类型bytesbits符号分配范围
byte18有符号-128 ~ 127
short216有符号-32,768 ~ 32,767
char216无符号0x0000 ~ 0xffff
int432有符号-2,147,483,648 ~ 2,147,483,647 也就是 10^9 左右
long864有符号-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

ZZAX 微信公众

文档一更新,立刻告诉你