位(bit)运算

一、二进制:所谓二进制就是逢二进一 (0,1), 因为使用二进制只有 0, 1 两个数,简单,易于电子方式实现 , 同时,通过0,1 组合可以表示任意一个数.
二进制有三个重要的概念:

1.原码
用二进制来表示一个数,这个码就是原码.

1 ------> 原码 00000000 0000000 0000000 00000101 = 12的零次方+02的一次方+1* 2的二次方=1+0+4=5

2.负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)

反码(正数的反码和它的原码一样 , 负数反码 是 符号位不变其它位取反)
补码(正数的补码和它的原码一样,负数的补码是 它的反码+1)
举例

-1
-1的原码 10000000 00000000 00000000 00000001
-1的反码 11111111 11111111 11111111 11111110
-1 的补码 11111111 11111111 111111111 11111111

3.在计算机运算的时候,都是以补码的方式来运算的

4+5=>计算机 4-5=4+(-5)

这句话意思就是,不管一个数是正数还是负数,都要被转成补码,然后进行运算.
位运算一览表:


位运算表

该图的前面四个是位运算
其运算规则是:
按位与& : 两位全为1,结果为1
按位或| : 两位有一个为1,结果为1
按位异或 ^ : 两位一个为0,一个为1,结果为1
按位取反 : 0->1 ,1->0
<h3>求解:~2=?</h3>

步骤 : 首先要求出 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

~-5=?

-5 的 补码找出来.
-5 原码 10000000 00000000 00000000 00000101
-5 反码 11111111 11111111 11111111 11111010
-5 补码 11111111 11111111 11111111 11111011

~-5取反 00000000 00000000 00000000 00000100 (补码)

4

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

$c=1<<2;

1<<2
1的补码
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000100

    $d=-1<<2;

推荐阅读更多精彩内容