前言 🔗
随着.net的学习已经接近尾声,转向golang python亦或是前端的欲望越来越强烈
在fox大佬的补习下,粗略的掌握了计算机最最基础的底层知识和原理,这对后续的学习是大有脾益的
甚至我现在觉得,一个程序员如果连最基础的二进制都不会的话,那么罔为程序员
二进制之 & 🔗
按位与运算符 & 会比较两个二进制数的每一位,只有当对应位都是1时,结果才是1,否则结果是0。 简单来说,& 只会在两位同时为1的情况下返回1。
0 & 0 = 0
1 & 1 = 1
0 & 1 = 0
1 & 1 = 1
二进制之 | 🔗
按位或运算符 | 会比较两个二进制数的每一位,只要有一位是1,结果就是1;只有当两位都为0时,结果才是0。
0 | 0 = 0
1 | 1 = 1
0 | 1 = 1
1 | 1 = 1
二进制之 ^ 🔗
按位异或(^)会比较两个二进制数的每一位,如果两位不同,则结果为1;如果两位相同,则结果为0。
异或的一个重要特性是,它可以用于翻转位。如果一个数字与某个位掩码进行异或操作,可以将对应的位反转(0变1,1变0)。
0 ^ 0 = 0
1 ^ 1 = 0
0 ^ 1 = 1
1 ^ 1 = 0
二进制之 » 🔗
右移运算符(»)会将一个数的二进制表示向右移动若干位,右移相当于移除末尾的位。右移 n 位等价于这个数除以 2^n。
高效的除法操作:右移可以高效地实现除法操作,例如 x » 1 相当于 x / 2,x » 2 相当于 x / 4。
二进制之 « 🔗
左移运算符(«)会将一个数的二进制表示向左移动若干位,左移相当于在二进制末尾添加0。左移 n 位等价于这个数乘以 2^n。
高效的乘法操作:左移可以高效地实现乘法操作,例如 x « 1 相当于 x * 2,x « 2 相当于 x * 4。
二进制之补码 🔗
把一个数的负数解释成是0x100减去这个数,即 -a = 0x100 - a
然后看等式 ~a = 0xFF - a 括号两边同时+1得
~a + 1 = 0xFF - a + 1
~a + 1 = 0x100 - a
根据首式 -a = 0x100 - a
即能得到 ~a + 1 = -a
比如说20,那就是0001 0100反转后就是1110 1011 + 0000 0001?
二进制之浮点数(float) 🔗
转写成二进制小数后,都是一系列 1/2^n的和
比如 0.75 ,就是 0.5和0.25的和,即它是由 1/2^-1 + 1/2^2 组合而来
比如说0.8,则是0.5+0.25+0.0xxx
二进制之取余 🔗
在只考虑整数的情况(但前提是除数必须是 2 的幂次),可以使用 & 来实现高效的取余操作,例如 15 % 4 可以写为 15 & 3
二进制之妙用 🔗
在使用& |时候,一个int32的类型最多可以表示32种不同的状态,int64最多可以表示64种不同的状态
这对于数据库的设计来说是有很大的作用的(虽然现在硬盘不值钱了,但是学会这些基础的概念是非常有必要的)
int32
对应的状态位数值 🔗
位数 | 数值 | 二进制表示 |
---|---|---|
0 | 1 | 0000 0001 |
1 | 2 | 0000 0010 |
2 | 4 | 0000 0100 |
3 | 8 | 0000 1000 |
4 | 16 | 0001 0000 |
5 | 32 | 0010 0000 |
6 | 64 | 0100 0000 |
7 | 128 | 1000 0000 |
8 | 256 | 0001 0000 0000 |
9 | 512 | 0010 0000 0000 |
10 | 1024 | 0100 0000 0000 |
11 | 2048 | 1000 0000 0000 |
12 | 4096 | 0001 0000 0000 0000 |
13 | 8192 | 0010 0000 0000 0000 |
14 | 16384 | 0100 0000 0000 0000 |
15 | 32768 | 1000 0000 0000 0000 |
16 | 65536 | 0001 0000 0000 0000 0000 |
17 | 131072 | 0010 0000 0000 0000 0000 |
18 | 262144 | 0100 0000 0000 0000 0000 |
19 | 524288 | 1000 0000 0000 0000 0000 |
20 | 1048576 | 0001 0000 0000 0000 0000 0000 |
21 | 2097152 | 0010 0000 0000 0000 0000 0000 |
22 | 4194304 | 0100 0000 0000 0000 0000 0000 |
23 | 8388608 | 1000 0000 0000 0000 0000 0000 |
24 | 16777216 | 0001 0000 0000 0000 0000 0000 0000 |
25 | 33554432 | 0010 0000 0000 0000 0000 0000 0000 |
26 | 67108864 | 0100 0000 0000 0000 0000 0000 0000 |
27 | 134217728 | 1000 0000 0000 0000 0000 0000 0000 |
28 | 268435456 | 0001 0000 0000 0000 0000 0000 0000 0000 |
29 | 536870912 | 0010 0000 0000 0000 0000 0000 0000 0000 |
30 | 1073741824 | 0100 0000 0000 0000 0000 0000 0000 0000 |
31 | 2147483648 | 1000 0000 0000 0000 0000 0000 0000 0000 |
int64
对应的状态位数值 🔗
位数 | 数值 | 二进制表示 |
---|---|---|
0 | 1 | 0000 0001 |
1 | 2 | 0000 0010 |
2 | 4 | 0000 0100 |
3 | 8 | 0000 1000 |
4 | 16 | 0001 0000 |
5 | 32 | 0010 0000 |
6 | 64 | 0100 0000 |
7 | 128 | 1000 0000 |
8 | 256 | 0001 0000 0000 |
9 | 512 | 0010 0000 0000 |
10 | 1024 | 0100 0000 0000 |
11 | 2048 | 1000 0000 0000 |
12 | 4096 | 0001 0000 0000 0000 |
13 | 8192 | 0010 0000 0000 0000 |
14 | 16384 | 0100 0000 0000 0000 |
15 | 32768 | 1000 0000 0000 0000 |
16 | 65536 | 0001 0000 0000 0000 0000 |
17 | 131072 | 0010 0000 0000 0000 0000 |
18 | 262144 | 0100 0000 0000 0000 0000 |
19 | 524288 | 1000 0000 0000 0000 0000 |
20 | 1048576 | 0001 0000 0000 0000 0000 0000 |
21 | 2097152 | 0010 0000 0000 0000 0000 0000 |
22 | 4194304 | 0100 0000 0000 0000 0000 0000 |
23 | 8388608 | 1000 0000 0000 0000 0000 0000 |
24 | 16777216 | 0001 0000 0000 0000 0000 0000 0000 |
25 | 33554432 | 0010 0000 0000 0000 0000 0000 0000 |
26 | 67108864 | 0100 0000 0000 0000 0000 0000 0000 |
27 | 134217728 | 1000 0000 0000 0000 0000 0000 0000 |
28 | 268435456 | 0001 0000 0000 0000 0000 0000 0000 0000 |
29 | 536870912 | 0010 0000 0000 0000 0000 0000 0000 0000 |
30 | 1073741824 | 0100 0000 0000 0000 0000 0000 0000 0000 |
31 | 2147483648 | 1000 0000 0000 0000 0000 0000 0000 0000 |
32 | 4294967296 | 0001 0000 0000 0000 0000 0000 0000 0000 0000 |
33 | 8589934592 | 0010 0000 0000 0000 0000 0000 0000 0000 0000 |
34 | 17179869184 | 0100 0000 0000 0000 0000 0000 0000 0000 0000 |
35 | 34359738368 | 1000 0000 0000 0000 0000 0000 0000 0000 0000 |
36 | 68719476736 | 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
37 | 137438953472 | 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
38 | 274877906944 | 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
39 | 549755813888 | 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
40 | 1099511627776 | 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
41 | 2199023255552 | 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
42 | 4398046511104 | 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
43 | 8796093022208 | 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
44 | 17592186044416 | 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
45 | 35184372088832 | 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
46 | 70368744177664 | 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
47 | 140737488355328 | 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
48 | 281474976710656 | 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
49 | 562949953421312 | 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
50 | 1125899906842624 | 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
51 | 2251799813685248 | 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
52 | 4503599627370496 | 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
53 | 9007199254740992 | 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
54 | 18014398509481984 | 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
55 | 36028797018963968 | 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
56 | 72057594037927936 | 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
57 | 144115188075855872 | 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
58 | 288230376151711744 | 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
59 | 576460752303423488 | 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
60 | 1152921504606846976 | 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
61 | 2305843009213693952 | 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
62 | 4611686018427387904 | 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
63 | 9223372036854775808 | 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |