前言 🔗
随着.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 |