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

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

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

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

  (!!! 反码运算需要循环进位,即: 2 - 1 = 2 + (-1) = (00000010)原 + (10000001)原 = (00000010)反 + (11111110)反 = (00000001)反 = (00000001)原 = 1 !!!)

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

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

posted @ 2016-09-07 21:06  勿忘初心0924  阅读(432)  评论(0编辑  收藏  举报