请问位运算符怎么理解?
例子如下:<?php$m=8;$n=12;$mn=$m&$n;//位与echo$mn."<br>";$mn=$m|$n;//位或echo$mn."<br>";$mn=$m...
例子如下:
<?php
$m = 8 ;
$n = 12 ;
$mn = $m & $n ; //位与
echo $mn ."<br>" ;
$mn = $m | $n ; //位或
echo $mn ."<br>" ;
$mn = $m ^ $n ; //位异或
echo $mn ."<br>" ;
$mn = ~$m ; //位取反
echo $mn ."<br>" ;
?>
结果为:
8
12
4
-9
完全看不懂啊,位运算符有什么用呢?哪位大神能跟我解释一下这段代码... 展开
<?php
$m = 8 ;
$n = 12 ;
$mn = $m & $n ; //位与
echo $mn ."<br>" ;
$mn = $m | $n ; //位或
echo $mn ."<br>" ;
$mn = $m ^ $n ; //位异或
echo $mn ."<br>" ;
$mn = ~$m ; //位取反
echo $mn ."<br>" ;
?>
结果为:
8
12
4
-9
完全看不懂啊,位运算符有什么用呢?哪位大神能跟我解释一下这段代码... 展开
2个回答
展开全部
$a & $b and(按位与)
$a | $b or(按位或)
$a ^ $b Xor(按位异或)
~$a Not(按位非)
$a << $b Shift left(左移)
$a >> $b Shift right(右移)
详解
$a & $b 按位与 把$a和$b中都为1的位设为1;
例:10 & 12 = 8
10 1010
12 1100
1000 8
$a | $b 按位或 把$a或$b中有一个为1的为设为1;
例:10 | 12 = 14
10 1010
12 1100
1110 14
$a ^ $b 按位异或
例:10 ^ 12
10 1010
12 1100
0110 6
~a 按位非 把$a中的为0的为设为1,1的为设为0
例:~10 =
10 1010 1111111111111111111111111111111111111111111111111111111111110101 -11
$a << $b 左移 把$a中的为向左移动$b次(每一次移动都表示乘以2);
例:1 << 10 = 1024
1(1) 左移10位 10000000000(1024)
相当于1*2的10次方,php中没有幂运算真是郁闷。
$a >> $b 右移 把$a中的为向右移动$b次(每一次移动都表示除以2);
例:1024 << 2 = 1256
10000000000(1024) 右移2位就是 100000000(256)
php为运算$a & $b and(按位与)$a | $b or(按位或)$a ^ $b Xor(按位异或)~$a Not(按位非)$a << $b Shift left(左移)$a >> $b Shift right(右移)
详解$a & $b 按位与 把$a和$b中都为1的位设为1;例:10 & 12 = 810 101012 1100 1000 8
$a | $b 按位或 把$a或$b中有一个为1的为设为1;例:10 | 12 = 1410 101012 1100 1110 14
$a ^ $b 按位异或例:10 ^ 1210 101012 1100 0110 6
~a 按位非 把$a中的为0的为设为1,1的为设为0例:~10 = 10 1010 1111111111111111111111111111111111111111111111111111111111110101 -11
$a << $b 左移 把$a中的为向左移动$b次(每一次移动都表示乘以2);例:1 << 10 = 10241(1) 左移10位 10000000000(1024)相当于1*2的10次方,php中没有幂运算真是郁闷。
$a >> $b 右移 把$a中的为向右移动$b次(每一次移动都表示除以2);例:1024 << 2 = 125610000000000(1024) 右移2位就是 100000000(256)
标志位字段与位运算符的结合
PHP里的error_reporting的参数值列表
value constant
1 E_ERROR
2 E_WARNING
4 E_PARSE
8 E_NOTICE
16 E_CORE_ERROR
32 E_CORE_WARNING
64 E_COMPILE_ERROR
128 E_COMPILE_WARNING
256 E_USER_ERROR
512 E_USER_WARNING
1024 E_USER_NOTICE
2047 E_ALL
2048 E_STRICT
4096 E_RECOVERABLE_ERROR
发现value的值都是跳跃式的吧,而且全是2的n+1次方.
再看下面这个。把value的值转成二进制了。
value constant
0000 0001 E_ERROR
0000 0010 E_WARNING
0000 0100 E_PARSE
0000 1000 E_NOTICE
0001 0000 E_CORE_ERROR
0010 0000 E_CORE_WARNING
.
.
.
… …一次为每加一次方就是二进制加了一位(学过计算机的差不多都知道:)…)
注意:每个选项对应了一位(1为开启 0为关闭)
好了,下面我们看看这么设置参数的好处。
举三个参数为例来看是什么效果吧
error_reporting(3);//decbin(3) == 0000 0011; (相当于设置 E_WARNING 和 E_ERROR )
error_reporting(4);//decbin(4) == 0000 0100;(相当于设置 E_PARSE )
error_reporting(5);//decbin(5) == 0000 0101;(相当于设置 E_PARSE 和 E_ERROR)
获取设置:
要看某项是否开启的判断可以用位运算来获得(& — “与”规则 全1为1,否则为0)
//E_PARSE
if($n & 4){
//E_PARSE开启
//4的二进制是 0100,因为只有第3位是1,所以进行”&”操作时其它何位置全被置0了
//因此只有$n的第三位也是1时结果才会大于0。
//如4(0100),5(0101),6(0110),7(0111)
}else{
//E_PARSE关闭
//第三位为0了就代表此选项是关闭状态
}
改变设置:($n代表当前的十进制值)
在应用时我们可能跟据需要针对某位进行开关设置。
看下面的用法。
//关闭E_PARSE项 用 ‘&’“与”规则
$n = $n&(8192-4-1);
//为什么用8191呢?
//这和你的选项数有关系,这个错误显示标记一共用了13位(4096的二进制是13位),而8192是(14位).
//为什么减4减1呢?
//8192-4-1=8187。(1111111111011)二进制是13位了,与我们用到的最大位数一样了。而且对应的第三位上的值是0了。
//用这个数去和1到4096之间任何一个数按位“与”运算,是不是除了第三位会置0,其它位上的值不会变化呢? ”与”规则 :)
//同理,想关掉 E_WARNING
//$n = $n&(8192-2-1);
//开启E_PARSE项用到‘|’“或”规则
$n = $n|4;
//看了上面的关闭,对于开启有点想法儿了吧:)
// ‘|’ — “或”规则 有1为1 否则为0
//上面是所有位为1的情况下不影响其它位,现在则变成所有位为0的情况下不会影响其它位了:)
//所以我们只要把后面的操作数的二进制位相应的值置1,其它所有位置0就OK了。
//发现了吗?正好是我们每个设置项对应的十进制数值:)
思路就是这样了,如果想同时操作多个位上的设置值也可以,就看你的操作数怎么设置了。
以后开发中遇到需要一个参数同时设置多个选项的情况时我们就可以考虑一下这个方法了:)
$a | $b or(按位或)
$a ^ $b Xor(按位异或)
~$a Not(按位非)
$a << $b Shift left(左移)
$a >> $b Shift right(右移)
详解
$a & $b 按位与 把$a和$b中都为1的位设为1;
例:10 & 12 = 8
10 1010
12 1100
1000 8
$a | $b 按位或 把$a或$b中有一个为1的为设为1;
例:10 | 12 = 14
10 1010
12 1100
1110 14
$a ^ $b 按位异或
例:10 ^ 12
10 1010
12 1100
0110 6
~a 按位非 把$a中的为0的为设为1,1的为设为0
例:~10 =
10 1010 1111111111111111111111111111111111111111111111111111111111110101 -11
$a << $b 左移 把$a中的为向左移动$b次(每一次移动都表示乘以2);
例:1 << 10 = 1024
1(1) 左移10位 10000000000(1024)
相当于1*2的10次方,php中没有幂运算真是郁闷。
$a >> $b 右移 把$a中的为向右移动$b次(每一次移动都表示除以2);
例:1024 << 2 = 1256
10000000000(1024) 右移2位就是 100000000(256)
php为运算$a & $b and(按位与)$a | $b or(按位或)$a ^ $b Xor(按位异或)~$a Not(按位非)$a << $b Shift left(左移)$a >> $b Shift right(右移)
详解$a & $b 按位与 把$a和$b中都为1的位设为1;例:10 & 12 = 810 101012 1100 1000 8
$a | $b 按位或 把$a或$b中有一个为1的为设为1;例:10 | 12 = 1410 101012 1100 1110 14
$a ^ $b 按位异或例:10 ^ 1210 101012 1100 0110 6
~a 按位非 把$a中的为0的为设为1,1的为设为0例:~10 = 10 1010 1111111111111111111111111111111111111111111111111111111111110101 -11
$a << $b 左移 把$a中的为向左移动$b次(每一次移动都表示乘以2);例:1 << 10 = 10241(1) 左移10位 10000000000(1024)相当于1*2的10次方,php中没有幂运算真是郁闷。
$a >> $b 右移 把$a中的为向右移动$b次(每一次移动都表示除以2);例:1024 << 2 = 125610000000000(1024) 右移2位就是 100000000(256)
标志位字段与位运算符的结合
PHP里的error_reporting的参数值列表
value constant
1 E_ERROR
2 E_WARNING
4 E_PARSE
8 E_NOTICE
16 E_CORE_ERROR
32 E_CORE_WARNING
64 E_COMPILE_ERROR
128 E_COMPILE_WARNING
256 E_USER_ERROR
512 E_USER_WARNING
1024 E_USER_NOTICE
2047 E_ALL
2048 E_STRICT
4096 E_RECOVERABLE_ERROR
发现value的值都是跳跃式的吧,而且全是2的n+1次方.
再看下面这个。把value的值转成二进制了。
value constant
0000 0001 E_ERROR
0000 0010 E_WARNING
0000 0100 E_PARSE
0000 1000 E_NOTICE
0001 0000 E_CORE_ERROR
0010 0000 E_CORE_WARNING
.
.
.
… …一次为每加一次方就是二进制加了一位(学过计算机的差不多都知道:)…)
注意:每个选项对应了一位(1为开启 0为关闭)
好了,下面我们看看这么设置参数的好处。
举三个参数为例来看是什么效果吧
error_reporting(3);//decbin(3) == 0000 0011; (相当于设置 E_WARNING 和 E_ERROR )
error_reporting(4);//decbin(4) == 0000 0100;(相当于设置 E_PARSE )
error_reporting(5);//decbin(5) == 0000 0101;(相当于设置 E_PARSE 和 E_ERROR)
获取设置:
要看某项是否开启的判断可以用位运算来获得(& — “与”规则 全1为1,否则为0)
//E_PARSE
if($n & 4){
//E_PARSE开启
//4的二进制是 0100,因为只有第3位是1,所以进行”&”操作时其它何位置全被置0了
//因此只有$n的第三位也是1时结果才会大于0。
//如4(0100),5(0101),6(0110),7(0111)
}else{
//E_PARSE关闭
//第三位为0了就代表此选项是关闭状态
}
改变设置:($n代表当前的十进制值)
在应用时我们可能跟据需要针对某位进行开关设置。
看下面的用法。
//关闭E_PARSE项 用 ‘&’“与”规则
$n = $n&(8192-4-1);
//为什么用8191呢?
//这和你的选项数有关系,这个错误显示标记一共用了13位(4096的二进制是13位),而8192是(14位).
//为什么减4减1呢?
//8192-4-1=8187。(1111111111011)二进制是13位了,与我们用到的最大位数一样了。而且对应的第三位上的值是0了。
//用这个数去和1到4096之间任何一个数按位“与”运算,是不是除了第三位会置0,其它位上的值不会变化呢? ”与”规则 :)
//同理,想关掉 E_WARNING
//$n = $n&(8192-2-1);
//开启E_PARSE项用到‘|’“或”规则
$n = $n|4;
//看了上面的关闭,对于开启有点想法儿了吧:)
// ‘|’ — “或”规则 有1为1 否则为0
//上面是所有位为1的情况下不影响其它位,现在则变成所有位为0的情况下不会影响其它位了:)
//所以我们只要把后面的操作数的二进制位相应的值置1,其它所有位置0就OK了。
//发现了吗?正好是我们每个设置项对应的十进制数值:)
思路就是这样了,如果想同时操作多个位上的设置值也可以,就看你的操作数怎么设置了。
以后开发中遇到需要一个参数同时设置多个选项的情况时我们就可以考虑一下这个方法了:)
2013-07-04 · 知道合伙人软件行家
关注
展开全部
1. 位运算符有什么用?
这个还真不太好说,看起来有点不太负责任的,但实际上就那么回事的回答是:当你需要用到的时候,你就会感觉有用了。
举个小例子,假设有一个东西有8种工作状态,那么,通常的情况下,你当然可以每个状态做一个标志变量,比如,A真代表某通道打开,A假代表某通道关闭...等等,但在某些情况下(比如变量没有那么多,或者出于管理方便的考虑等等),那么你考虑使用一个8位的变量,并通过对这个变量进行位运算来判断是很常用的1个小技巧。
2. 解释一下这段代码,
程序上没啥好解释,后面的注释也说明了,而要想看明白结果,你需要补充一下数学知识(二进制数运算)。
简单说一下:
十进制12=二进制 1100
十进制 8=二进制 1000
$mn = $m & $n ; //位与
1100
与 1000
-----------
1000 结果= 8
1100
或 1000
-----------
1100 结果= 12
1100
异或 1000
---------------
0100 结果= 4
这个还真不太好说,看起来有点不太负责任的,但实际上就那么回事的回答是:当你需要用到的时候,你就会感觉有用了。
举个小例子,假设有一个东西有8种工作状态,那么,通常的情况下,你当然可以每个状态做一个标志变量,比如,A真代表某通道打开,A假代表某通道关闭...等等,但在某些情况下(比如变量没有那么多,或者出于管理方便的考虑等等),那么你考虑使用一个8位的变量,并通过对这个变量进行位运算来判断是很常用的1个小技巧。
2. 解释一下这段代码,
程序上没啥好解释,后面的注释也说明了,而要想看明白结果,你需要补充一下数学知识(二进制数运算)。
简单说一下:
十进制12=二进制 1100
十进制 8=二进制 1000
$mn = $m & $n ; //位与
1100
与 1000
-----------
1000 结果= 8
1100
或 1000
-----------
1100 结果= 12
1100
异或 1000
---------------
0100 结果= 4
追问
请问各个进制的关系?
追答
简单点说:
十进制,逢10进1;
二进制,逢2进1;
十六进制,逢16进1;
各进制间的转换,要解释起来就比较烦琐了,建议你搜索下相关的资料。
一个比较直观形象的进制间关系,你可以打开windows附件里的计算器软件,你可以在不同进制之间进行转换,从而体验下。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询