在php当中,有关于位运算取反是一个很难理解的东西,主要在它要转来转去,如果是用程序还无所谓,直接就是:
(?php
//想求什么数自己填上去,以5的为例
$a=~5;
echo "$a"."
";
?)
(由于php前面加<>文章无法发表,所以只能用())
运行,这样就可以得出结果,但是如果是笔试就有点问题,需一步步的推导,如果笔试不要过程还好,要过程就是一个头大的问题。
不要过程
0取反结果为0
-1取反结果为0
-2取反结果为1
-3取反结果为2
-4取反结果为3
-5取反结果为4
-6取反结果为5
-7取反结果为6
反过来也是一样。
..................
其余的数不用我说,其实大家也明白了,但是有些人就要过程,我个人觉得这是没有必要的,但是就是有人要,怎么办呢?这里就需要大家理解原码,反码,补码的概念。
正数和0不用说,原码=反码=补码。
这里最重要的是负数,原码=(各位取反)反码=(各位取反+1或者反码+1)补码
如-5,(-等于1,+等0,一共32位,符号在第一位)。
-5原码:10000000 00000000 00000000 00000101
-5反码:11111111 11111111 11111111 11111010(符号位不变,其它位取反)
-5补码:11111111 11111111 11111111 11111011(在反码上+1)
以上知识是很简单的,但是接下来就有点难了,怎样取反呢?
对-5的补码取反,再对取反结果转成原码,再化成十进制,是不是很麻烦。没办法,在计算机中,只有补码才能运算,只有十进制大家才认识,如果这个世界上人人都是认补码,那么就没有这么麻烦了,如果你买米,问老板,这个米是不是00000000
00000000 00000000 00000101元一斤(5元一斤),如果老板能听明白,那么就不成问题了。
显然老板听不懂,所以只能转换才行。接下来就介绍如何转换,还是以-5为例
-5的补码:11111111 11111111 11111111 11111011
取反结果:00000000 00000000 00000000 00000100这里是补码
接下来是+1还是-1呢?在这里,很多人都是犯错误的,我一直做错,以为不是加就是减,但是我忘记了,正数的原码=反码=补码这一原则,我还在减1,还在求反,这是错误的,所以这里的补码结果就是最终结果:00000000
00000000 00000000 00000100,化为十进制就是4。
那对于正数有必要说明一下:
还是以5为例子:
5原码:00000000 00000000 00000000 00000101
5反码:00000000 00000000 00000000 00000101
5补码:00000000 00000000 00000000 00000101
取反结果:11111111 11111111 11111111 11111010这里是补码
接下来是+1还是-1呢?有两种处理方法,一种是先-1,再取反,另一种是先取反,再+1
第一种先-1,再取反
先-1:11111111 11111111 11111111 11111001
再取反:10000000 00000000 00000000 00000110
结果4+2=6,因为符号为负,所以最终结果是:-6
第二种先取反,再+1
先取反:10000000 00000000 00000000 00000101
再+1:10000000 00000000 00000000 00000110
结果一样:-6
以上就是php中取反的全过程,不过我个人觉得没有必要知道这些,这仅仅只是为了找工作时面试,因为经验告诉我们,只要你记住结果比什么都好。过程交结电脑去完成吧,我们只需要记得是怎么回事就可以了。