php位运算

作者: 鲁智深 分类: PHP 发布时间: 2014-12-27 07:18

要想搞清楚位运算,必须先了解二进制

所谓二进制就是逢二进一,0、1是基本符合。

二进制

网上对原码,反码,补码的解释过于复杂,我这里精简几句话:

对于有符号的而言:

1、二进制的最高位是符号位:0表示正数,1表示负数;

2、正数的原码,反码,补码都一样;

3、负数的反码=它的原码符号位不变,其他位取反(0->1,1->0);

4、负数的补码=它的反码+1;

5、0的反码,补码都是0;

6、php没有无符号数,换言之,php中的数都是有符号的;

7、在计算机运算的时候,都是以补码的方式来运算的。(这句话意思就是,不管一个数是正数还是负数,都要被转成补码,然后进行运算

二进制3个重要概念

1、原码:用二进制表示一个数,这个码就是原码;

1——> 00000000 0000000 00000000 00000001

举例

-1的原码 10000000 00000000 00000000 00000001

-1的反码 11111111 11111111 11111111 11111110

-1的补码 11111111 11111111 11111111 11111111

php位运算一览表

例子 名称 结果
$a & $b And(按位与) 将把$a和$b中都为 1 的位设为 1。
$a | $b Or(按位同或) 将把$a和$b中任何一个为 1 的位设为 1。
$a ^ $b Xor(按位异或) 将把$a和$b中一个为 1 另一个为 0 的位设为 1。
~ $a Not(按位取反) 将$a中为 0 的位设为 1,反之亦然。
$a << $b Shift left(左移) 将$a中的位向左移动$b次(每一次移动都表示”乘以 2″)。
$a >> $b Shift right(右移) 将$a 中的位向右移动$b次(每一次移动都表示”除以 2″)。

该图的前面4个是位运算。

案例一

~2=?

步骤:首先要求出2的补码

2是正数,所以原码=反码=补码

00000000 00000000 00000000 00000010

~2就是

11111111 11111111 11111111 11111101  (补码)->原码

?负数的原码-》反码-》补码

推出其反码(对补码-1)

11111111 11111111 11111111 111111100

推出原码

10000000 00000000 00000000 00000011=-3

案例二

~-5=?

-5的补码找出来

-5的原码 10000000 000000000 000000000 000000101

-5的反码 11111111 111111111 111111111 111111010

-5的补码 11111111 111111111 111111111 111111011

~-5 取反 00000000 000000000 000000000 000000100(补码)

输出4

2&3=?

2&3首先找到2和3的补码

2的补码 00000000 00000000 00000000 000000010

3的补码 00000000 00000000 00000000 000000011

2&3 00000000 00000000 00000000 000000010

输出2

案例三

2|3

2的补码 00000000 00000000 00000000 000000010

3的补码 00000000 00000000 00000000 000000011

2|3 00000000 00000000 00000000 000000011

输出3

案例四

2^3

2的补码 00000000 00000000 00000000 000000010

3的补码 00000000 00000000 00000000 000000011

2^3 00000000 00000000 00000000 000000001

输出1

php位移运算

在php中位运算有两个>>(右移)<<(左移) 运算的规则是: 算术右移:低位溢出,符号位不变,并用符号位补溢出的高位 算术左移:符号位不变,低位补0 根据我们的前面的规范,来完成几个案例

案例一

$a=1>>2;

1的补码 00000000 00000000 00000000 00000001

1>>2 00000000 00000000 00000000 00000000

输出0

案例二

$b=-1>>2;

-1的补码

-1的原码 10000000 00000000 00000000 000000001

-1的反码 11111111 11111111 11111111 111111110

-1的补码 11111111 11111111 11111111 111111111

-1>>2 11111111 11111111 11111111 111111111(补码)

结果

补码->原码

它的反码就是(-1) 11111111 11111111 11111111 111111110

它的原码就是(取反) 10000000 00000000 00000000 000000001

输出-1

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

2条评论
  • weiking

    2015 年 1 月 11 日 16:19

    楼主用的表格插件是什么啊

    1. 爱映“疯”

      2015 年 1 月 11 日 20:14

      无插件,html代码编辑

发表评论

电子邮件地址不会被公开。 必填项已用*标注