& AND 与
| OR 或
~ NOT 非
^ XOR 异或
异或运算
有一个为真,但是不同时为真,值为真,否则为假
定理:同一变量与另一变量和其异或值异或等于自身。
用例:可使用于加密算法某一环节或更多环节,使算法更复杂,不易被破解,安全性更高。
例:使用XOR交换两个整数
y=5 101
swap x y
x = x ^ y = 100^101 = 001
y = x ^ y = 001^101 = 100
x = x ^ y = 001^100 = 101
x = 101 1+0+4 = 5
y = 100 0+0+4 = 4
例:位运算操作权限
$i = 1;
$mode = 2|4; //逻辑或运算,用来为用户增加权限
if ($i&$mode){ //使用逻辑与来判断是否具有某权限
echo '可执行';
}else{
echo '不可执行';
}
例:异或可以用来清除数据,两个相同的值做异或运算为0
$dd = 2;
echo $dd^$dd;
例:异或加密
<?php
$a = 135;
$encode = encode($a);
echo $encode, '<br />'; //7
$decode = decode($encode);
echo $decode, '<br />'; //135
function encode($src){
return $src^128;
}
function decode($key){
return $key^128;
}
?>
$a = 135;
$encode = encode($a);
echo $encode, '<br />'; //7
$decode = decode($encode);
echo $decode, '<br />'; //135
function encode($src){
return $src^128;
}
function decode($key){
return $key^128;
}
?>
例:使用异或判断两个IP地址是否属于同一子网
<?php
$a = '192.168.101.102';
$b = '192.168.101.100';
$c = '192.168.100.100';
$mask = '255.255.255.0';
$a_n = ip2long($a);
$b_n = ip2long($b);
$c_n = ip2long($c);
$mask_n = ip2long($mask);
echo $a_n & $mask_n , '<br />'; //-1062705920
echo $b_n & $mask_n , '<br />'; //-1062705920
echo $c_n & $mask_n , '<br />'; //-1062706176
//结论 a 和 b 在同一网段
$mask = '255.255.0.0';
$mask_n = ip2long($mask);
echo $a_n & $mask_n , '<br />'; //-1062731776
echo $b_n & $mask_n , '<br />'; //-1062731776
echo $c_n & $mask_n , '<br />'; //-1062731776
//结论 a b c 都在同一网段
?>
$a = '192.168.101.102';
$b = '192.168.101.100';
$c = '192.168.100.100';
$mask = '255.255.255.0';
$a_n = ip2long($a);
$b_n = ip2long($b);
$c_n = ip2long($c);
$mask_n = ip2long($mask);
echo $a_n & $mask_n , '<br />'; //-1062705920
echo $b_n & $mask_n , '<br />'; //-1062705920
echo $c_n & $mask_n , '<br />'; //-1062706176
//结论 a 和 b 在同一网段
$mask = '255.255.0.0';
$mask_n = ip2long($mask);
echo $a_n & $mask_n , '<br />'; //-1062731776
echo $b_n & $mask_n , '<br />'; //-1062731776
echo $c_n & $mask_n , '<br />'; //-1062731776
//结论 a b c 都在同一网段
?>