陈力:传智播客古代 珍宝币 泡泡龙游戏开发第27讲:PHP位运算
PHP程序设计语言中有哪些位运算,二进制的原码、反码、补码等怎么表示。按位与&、按位或|、按位异或^、按位取反~,算术左移、算术右移等都是贵阳网站建设中必须掌握的内容。本节为陈力:传智播客古代 珍宝币 泡泡龙游戏开发第27讲:PHP位运算
一、二进制
二进制(Binary)是逢2进位的进位制,0、1是基本算符。所谓二进制就是逢二进一(0,1),因为使用二进制只有0、1两个数,简单,易于电子方式实现,同时,通过0、1 组合可以表示任意一个数。
现代的电子计算机技术全部采用的是二进制,因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制数来表示的。二进制(Binary)数用0和1两个数字及其组合来表示任何数。进位规则是“逢2进1”,数字1在不同的位上代表不同的值,按从右至左的次序,这个值以二倍递增。
网上对原码、反码、补码的解释过于复杂,本文在贵阳网站建设中总结出以下精简的几句话:
对于有符号的而言:
①二进制的最高位是符号位: 0表示正数,1表示负数。
②正数的原码、反码、补码都一样。
③负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)。
④负数的补码=它的反码+1。
⑤0的反码、补码都是0。
⑥php没有无符号数,换言之,php中的数都是有符号的。
⑦在计算机运算的时候,都是以补码的方式来运算的。
有关二进制的三个重要的概念:
(1)原码:用二进制来表示一个数,这个码就是原码。
数字5的原码表示为 00000000 0000000 0000000 00000101 = 1*2的零次方+0*2的一次方+1* 2的二次方=1+0+4=5
(2)反码:负数的反码=它的原码符号位不变,其它位取反(0变成1,1变成0)
-1的原码 10000000 00000000 00000000 00000001
-1的反码 11111111 11111111 11111111 11111110
-1 的补码 11111111 11111111 111111111 11111111
(3)补码:在计算机运算的时候,都是以补码的方式来运算的。不管一个数是正数还是负数,都要被转成补码,然后进行运算。
二、位运算
位运算一览表
在上图中,前面四个是位运算。
其运算规则是:
按位与&:两位全为1,结果为1。全1出1。
按位或|: 两位中有一个为1,结果为1。有1出1。
按位异或^ :两位一个为0,一个为1,结果为1。01出1,11出0,00出0。
按位取反~: 0变1 ,1变0。0出1,1出0。
例:~2=?
步骤1 :首先要求出 2的补码
2是正数:原码=反码=补码
2的原码:00000000 00000000 00000000 00000010
步骤2:按位取反:
11111111 11111111 11111111 11111101。通过补码也可以推出原码。
补码也可以推出原码:由于负数的原码-》反码-》补码,所以进行反推时,
11111111 11111111 11111111 11111101->
推出其反码 :将补码-1
11111111 11111111 11111111 11111100
推出原码:符号位不变,再按位取反。
10000000 00000000 00000000 0000011 -> -3
所以结果为-3。
例:~-5=?
-5 的 补码先求出来:
-5 原码 10000000 00000000 00000000 00000101
-5 反码 11111111 11111111 11111111 11111010
-5 补码 11111111 11111111 11111111 11111011
~-5取反 00000000 00000000 00000000 00000100 (这结果也是补码形式,要转成原码形式再输出。因为符号位为正数,所以原码、反码和补码都是一样的。)
例:2&3=?
2&3 首先要找到 2 和 3的补码
2 的补码 00000000 00000000 00000000 00000010
3 的补码 00000000 00000000 00000000 00000011
2&3 00000000 00000000 00000000 00000010 [结果也是补码形式,因是正数无需再转换]
例:2|3=?
2 的补码 00000000 00000000 00000000 00000010
3 的补码 00000000 00000000 00000000 00000011
2|3 00000000 00000000 00000000 00000011
例:2^3
2 的补码 00000000 00000000 00000000 00000010
3 的补码 00000000 00000000 00000000 00000011
2^3 00000000 00000000 00000000 00000001
可以手动计算:13&7=? 5|4=? -3^3=?
三、位移运算
在php程序设计语言中,位运算有两种 >> (右移) <<(左移)。
运算的规则是:
算术右移:低位溢出,符号位不变,并用符号位补溢出的高位。
算术左移:符号位不变,低位补0。
根据前面的规范,来完成几个案例:
$a=1>>2;
先求出1的补码:
00000000 00000000 00000000 00000001
1>>2
00000000 00000000 00000000 00000000
例:$b=-1>>2;
步骤 -1 的补码:
-1 的原码 10000000 00000000 00000000 00000001
-1 的反码 11111111 11111111 11111111 11111110
-1 的补码 11111111 11111111 11111111 11111111
-1 >> 2
11111111 11111111 11111111 11111111 (补码形式的,要转换成原码)
补码->原码:
反码 11111111 11111111 11111111 11111110
原码 10000000 0000000 00000000 00000001
结果为-1。
例:$c=1<<2;
先求出1的补码:
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000100
结果为4。
【推荐阅读】陈力:传智播客古代 珍宝币 泡泡龙游戏开发第27讲:PHP位运算