上接6.PHP中的运算符1
1.位运算符
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”)。 |
注意:
1. 位运算符还可以与赋值运算符结合,进行位运算赋值操作
$a &= $b; //等价于 $a = $a&$b;
$a >>= $b //等价于 $a = $a>>$b
位运算符时的数据类型为string/integer,分析时要化为二进制形式,但在程序中书写及输出结果时仍为string/integer
位运算符也可以将boolean类型的值转换为整型再进行按位运算。例如:将true转换为1,再将1换为对应的二进制。
1.1 按位与
1 & 1 ==> 1
1 & 0 ==> 0
0 & 1 ==> 0
0 & 0 ==> 0;
例如:$r1 = 9 & 13;
数字9 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
数字13 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
结果$r1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
1.2 按位或
//1 | 1 ==> 1;
//1 | 0 ==> 1;
//0 | 1 ==> 1
//0 | 0 ==> 0
$a = 20;
$b = 30;
$c = $a | $b;
echo $c;//30
1.3 按位非
~ 1 ==> 0
~ 0 ==> 1
1.4 按位异或
1 ^ 1 ==> 0
0 ^ 0 ==> 0
1 ^ 0 ==> 1
0 ^ 1 ==> 1
1.5 &&
与&
,||
与|
的区别
逻辑运算符中的逻辑与’&&’和逻辑或’||’存在短路问题。详见上一篇博客。
位运算符中的按位与”&”和按位或”|”,作为逻辑判断时则不存在短路的问题。它们不会判断其前面的表达式是true还是false
,两边的表达式都会执行。
$bool = false; //声明一个boolean型变量,值为假
$num = 10; //声明一个整型的变量作为计数使用
if($bool && ($num++ > 0)){ //"&&"前面的表达式为false,发生短路,$num++没有执行到,$num的值保持不变
echo "条件不成立!";
}
echo $num;
if($bool & ($num++ > 0 )){//"&"不会发生短路,两边都会执行到,$num++被执行,$num自增1
echo "条件不成立!";
}
echo $num."<br/>";
$bool = true; //声明一个boolean型变量,值为假
$num = 10; //声明一个整型的变量作为计数使用
if($bool || ($num++ > 0)){ //"&&"前面的表达式为false,发生短路,$num++没有执行到,$num的值保持不变
echo "条件不成立!";
}
echo $num;
if($bool | ($num++ > 0 )){//"&"不会发生短路,两边都会执行到,$num++被执行,$num自增1
echo "条件不成立!";
}
echo $num;
1.6 按位左移运算:<<
形式:
A << n; //A是一个要被移动的数字,同样可以是普通数字,但按二进制去运算,n是一个指定要移动的位数
含义:
将数字A的二进制形式的每一个位上的数字往左边移动指定的位数n,则最左边的n位移出去了就不管了,最右边空出来的n位,补0就可以。
例如:$r1 = 9 << 2; //9的二进制形式为:1001
数字9 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
---|---|---|---|---|---|---|---|---|
左移2位 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
结果 | 0 | 0 | 25 | 0 | 0 | 22 | 0 | 0 |
可见结果是:32 + 4 = 36
1.6 按位右移运算:>>
形式:
A >> n;
//A是一个要被移动的数字,同样可以是普通数字,但按二进制去运算,n是一个指定要移动的位数
含义:
将数字A的二进制形式的每一个位上的数字往右边移动指定的位数n,则最右边的n位移出去了就不管了,最左边空出来的n位,补0就可以(对正数,实际是补符号位)。