php位异或,php异或运算

发布时间:2022-12-01

本文目录一览:

1、php赋值运算中,$a=2;$a^=2;结果却是0.这是为什么?"^"如果是乘方的话,结果不应该是4么? 2、[PHP语言PHP语言里的位运算符&、|、^ 、、〈〈 、〉〉这些符号我一个也不懂,希望高手给个全面的解释!拜](#PHP语言PHP语言里的位运算符&、|、^ 、、〈〈 、〉〉这些符号我一个也不懂,希望高手给个全面的解释!拜) 3、[关于php 位运算符的问题](#关于php 位运算符的问题) 4、[php中字符变量 异或 '1'^'2' 的值](#php中字符变量 异或 " 1^2 的值) 5、[php 简单的异或运算](#php 简单的异或运算)

php赋值运算中,$a=2;$a^=2;结果却是0.这是为什么?"^"如果是乘方的话,结果不应该是4么?

lz理解错了。^在早期的BASIC语言和一些伪代码中表示乘方 在PHP运算符中,^不是乘方,而是“位异或XOR”运算。 $a^=2是$a=$a^2的快捷形式。 异或运算遵循“同零异壹”的法则——数位上相同的二进制数字得0,数位上不同的数字得1. 比如1^1=0, 0^0=0, 1^0=1 (D)6^2=(B)110^10=(B)100=(D)4 (D)5^8=(B)101^1000=(B)1101=(D)13 (D)5^6=(B)101^110=(B)11=(D)3 PHP的浮点乘方用pow函数。 $a=pow(2,3);//2的3次方 $a=pow($a,$a);//$a的$a次方

PHP语言PHP语言里的位运算符&、|、^ 、~、〈〈 、〉〉这些符号我一个也不懂,希望高手给个全面的解释!拜

"" 按位与运算 按位与运算符""是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。 例如:95可写算式如下: 00001001 (9的二进制补码) 00000101 (5的二进制补码) 00000001 (1的二进制补码)

$a = 9;
$b = 5;
echo sprintf("%b", $a$b);

"|" 按位或运算 按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。 例如:9|5可写算式如下: 00001001 |00000101 00001101 (十进制为13)可见9|5=13

$a = 9;
$b = 5;
echo sprintf("%b", $a|$b)."\n"; //二进制
echo sprintf("%d", $a|$b)."\n"; //十进制

"^" 按位异或运算 按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如9^5可写成算式如下: 00001001 ^00000101 00001100 (十进制为12)

$a = 9;
$b = 5;
echo sprintf("%b", $a^$b)."\n"; //二进制
echo sprintf("%d", $a^$b)."\n"; //十进制

"~" 求反运算 求反运算符~为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位求反。 例如~9的运算为: ~(0000000000001001)结果为:1111111111110110

$a = 9;
$b = 5;
echo sprintf("%b", ~$a)."\n"; //二进制

"〈〈" 左移运算 左移运算符“”是双目运算符。其功能把“ ”左边的运算数的各二进位全部左移若干位,由“”右边的数指定移动的位数,高位丢弃,低位补0。 例如: a4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。

$a = 3;
$temp = $a4;
echo sprintf("%d", $temp)."\n"; //十进制

“” 右移运算 右移运算符“”是双目运算符。其功能是把“ ”左边的运算数的各二进位全部右移若干位,“”右边的数指定移动的位数。 例如: 设 a=48, a4 表示把00110000右移为00000011(十进制3)。 应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定

$a = 48;
$temp = $a4;
echo sprintf("%d", $temp)."\n"; //十进制

关于php 位运算符的问题

这个涉及到系统底层,WEB开发中几乎没用到,知道下有这个东西就好了。底层的东西解释总是简单不了的。 变量在内存中的存放都是二进制数字。整数在32位系统上是占用4字节,一个字节是8位,也就是32位,位运算就是位级的运算操作了。 $a $b Shift left(左移) 将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。 假定变量 $a 的值是 3,$b 的值是 2。 那么 $a 在内存中的存放的格式是: 00000000 00000000 00000000 00000011 每执行一次左移,都将所有的位向左移动,右边补零,左边超过的舍弃。 所以 $a 左移 2 得到的是: 00000000 00000000 00000000 00011000 也就是 12。相当于 3 × 2 × 2 = 12。 $a $b Shift right(右移) 将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。 假定变量 $a 的值是 24,$b 的值是 2。 那么 $a 在内存中的存放的格式是: 00000000 00000000 00000000 00011000 每执行一次右移,都将所有的位向由移动,右边超过的舍弃,左边空出的位补零。 所以 $a 右移 2 得到的是: 00000000 00000000 00000000 00000110 也就是 6。相当于 24 ÷ 2 ÷ 2 = 6。 位移运算是系统底层运算,运算的速度比乘除还要快很多,优化代码优化到极致的时候,可以将数换算成二的公倍数,然后进行位移计算。但在WEB开发中几乎没有任何必要,而且超过系统底层了,程序在的可移植性就会降低。 其他的位运算符也是差不多的。比如: $a $b And(按位与) 将把 $a 和 $b 中都为 1 的位设为 1。 假定变量 $a 的值是 5,$b 的值是 6。 $a: 00000000 00000000 00000000 00000101 $b: 00000000 00000000 00000000 00000110 $a $b : 00000000 00000000 00000000 00000101 00000000 00000000 00000000 00000110 ─────────────────────────── 00000000 00000000 00000000 00000100 竖的看,上下都是 1 的得到 1 ,否则就是 0。 所以 $a $b = 4。 ~ $a Not(按位非) 将 $a 中为 0 的位设为 1,反之亦然。 ~ $a: 00000000 00000000 00000000 00000101 ─────────────────────────── 11111111 11111111 11111111 11111010 如果 $a 是有符号整数,第一位是符号位,1表示负数,那么 ~ $a = -2147483642。 如果 $a 是无符号整数,第一位还是数据位,那么 ~ $a = 4294967290。 以下的就不详细介绍了: $a | $b Or(按位或) 将把 $a 或者 $b 中为 1 的位设为 1。 $a ^ $b Xor(按位异或) 将把 $a 和 $b 中不同的位设为 1。 平常说的几位的系统,就是系统处理整数的时候,是多少个位同时计算的,上面的例子都是基于32位系统。因为移动时超过的位将被舍弃,如果是64位或12位的,位移的结果就可能不一样了,要将计算时位的数量调整下。

php中字符变量 异或 '1'^'2' 的值

echo (1^2)."\n";
echo ('123'^'ACE')."\n";

你猜猜这个执行结果是什么? 在PHP里面,整数进行位运算的结果和C语言是相同的,这个你明白,我不多说。但是PHP的位运算更高级,如果左右参数都是字符串,则位运算符将操作字符的 ASCII 值。

php 简单的异或运算

异或一下可求出。

function showXor($a, $b){
    $c=$a^$b;
    printf('%x xor %x = %x <br/>',$a,$c,$b);
}
showXor(0xe79a, 0xc97a);
showXor(0xe520, 0xc520);

输出:

e79a xor 2ee0 = c97a 
e520 xor 2000 = c520