首页 > 代码库 > 关于原码反码补码以及位元算

关于原码反码补码以及位元算

  首先人脑能识别的,也就是我们常写的就是原码,因为数字都有正负之分所以,二进制的时候用最高位表示正负,0为正,1为负,例如3二进制位00000011,-3二进制位10000011.

  反码:正数的反码等于其本身,负数的反码:符号位不变其他位取反。(00000011)原=(00000011)反,(10000011)原=(11111100)反,为什么会有反码呐,因为用原码进行计算的时候:

比如3-3=3+(-3)=(00000011)原+(10000011)原=10000110=134,就会出现这样的误差,计算机是不会有人脑这种识别的,所以就引进了反码,3-3=3+(-3)=(00000011)原+(10000011)原=(00000011)反+(11111100)反=10000000=-0,这样结果就对了,有的人认为+0和-0有差别,所以就有引进了补码进行让计算机操作。

  补码:整数的补码等于其本身,负数的补码:符号位不变其他位取反然后+1。这样3+(-3)=(00000011)原+(10000011)原=(00000011)反+(11111100)反=(00000011)补+(11111101)补=(00000000)=+0;所以就没有了正负0之分;

  位元算:值得一提的位元算,以前就看过位运算,自以为很了解但是只是皮毛,因为以前只用整数的位运算,对负数不是很了解,最近学树状数组,遍历的时候用到了x&(-x)很神奇的啊,后来查了资料才发现,原来计算机的位元算都是用补码进行的位元算,而整数的反码补码就是其本身所以没什么影响,但是负数就不一样了,x&(-x)的实际作用就是取x二进制中从低位开始的0的个数,比如12=00001100,那12&(-12)=00000100=4,这样就达到了树状数组的要求了。

关于原码反码补码以及位元算