最近在处理discuz中帖子状态时接触到大学时学过的计算机基础(谁说大学学过的真正工作时不会用到,打脸),在这里记录一下,重新复习下大学的计算机基础。
一:机器数与真值
众所周知,计算机的世界是二进制的世界,0,1代表万物,我们代表一个数字,同样也是用0,1来组成,比如数字6用二进制表示为 0000 0110,数字有正负区分,所以二进制中最高位用来区分正负,0代表正1代表负,所以1000 0110 代表-6,刚才的举例中0000 0110,1000 0110就是机器数,其中代表机器数真正的数值的6和-6则称为真值。
二:原码
原码即机器数,例1的原码用8位二进制表示即为 0000 0001,-1的原码用8位二进制表示为 1000 0001
三:反码
正数的反码是其本身,负数的反码符号位不变,其他各位按位取反
例:
1的反码是 0000 0001
-1的反码是1111 1110
四:补码
正数的补码是其本身,负数的补码是符号位不变,其他各位按位取反最后再加1(换个说法就是在反码的基础上+1)
例:
1的补码是 0000 0001
-1的补码是 1111 1111
总结:
正数的原码,反码,补码一样,负数的反码是符号位不变其他各位置按位取反,补码是反码加一。
为什么会出现这些概念???
相信你对符号位的概念足够清楚的话,会发现计算机中其实只有加法,没有减法(减法的实现依赖符号位)
例:
1+1 = 2 0000 0001+000 0001 = 0000 0010 = 2
1-1 = 0 在计算机中表示为1+(-1) 0000 0001 + 1000 0001 = !!!这个时候你就发现不对了,怎么不是0呢?这个时候就有了反码的存在即 (反码的运算)0000 0001+1111 1110 = 1111 1111,1111 1111的原码是1000 0000 这个时候你会发现虽然是0 但是出现了-0,很奇怪的,紧接着补码出现了,接下来我们使用补码进行1+(-1)的运算 1的补码为本身 0000 0001 -1的补码为 1111 1111 那么 00000001+11111111 = 00000000 补码为0000 0000那其原码也为0000 0000 为0
再说会到dz中论坛帖子状态的问题,为了用一个字段存储更多的状态,所以会使用机器码来逻辑与,拆分时使用逻辑或来处理,以此判断帖子的状态,可存储多个状态。
同时说一句,dz这种论坛帖子状态的处理方式太繁琐且在维护角度而言有点得不偿失,建议这块有这么处理的同学及早拆分多个字段,按照不同维度去拆分状态字段生成多个字段在开发和维护上是一种更佳的解法。