PHP 位运算符 &、|、^ 、~、〈〈 、〉〉

本文详细介绍了按位与、按位或、按位异或、求反、左移和右移等位运算的基本概念及运算规则,并通过实例展示了这些运算的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

"&" 按位与运算
    按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。

例如:9&5可写算式如下:

      00001001        (9的二进制补码)

     &00000101        (5的二进制补码)

      00000001        (1的二进制补码)

<?php
$a = 9;
$b = 5;
echo sprintf("%b", $a&$b);
?>

"|" 按位或运算
按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。

例如:9|5可写算式如下:

    00001001

   |00000101

    00001101        (十进制为13)可见9|5=13

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

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

     00001001

    ^00000101  

     00001100       (十进制为12)

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

"~" 求反运算
求反运算符~为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位求反。

例如~9的运算为:

    ~(0000000000001001)结果为:1111111111110110

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

"〈〈" 左移运算
左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。

例如:

    a<<4

指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。 

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

“>>” 右移运算
   右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。

例如:

设  a=48,

a>>4

表示把00110000右移为00000011(十进制3)。

应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定

<?php
$a = 48;
$temp = $a>>4;
echo sprintf("%d", $temp)."\n"; //十进制
### PHP `preg_match` 函数与 GET 参数 `wrappers` 当处理来自 HTTP 请求的输入数据时,特别是通过 `$_GET` 获取的数据,在使用正则表达式函数如 `preg_match()` 进行模式匹配时需格外小心。对于特定参数名如 `wrappers` 的情况,理解如何安全有效地应用正则表达式至关重要。 #### 安全性考量 直接将未经验证或清理过的用户输入用于构建正则表达式的模式部分是非常危险的行为[^1]。这可能导致恶意用户利用特殊字符构造请求,从而执行任意代码或者绕过预期的安全机制。因此,在实际开发过程中应当避免让用户控制整个正则表达式的定义。 #### 使用示例 假设有一个场景需要检测 URL 中是否存在名为 `wrappers` 的查询字符串,并且希望确认该值是否符合某种预设格式,则可以按照下面的方式编写: ```php // 假定期望 &#39;wrappers&#39; 只能包含字母数字以及下划线 $pattern = &quot;/^[a-zA-Z0-9_]+$/&quot;; if (isset($_GET[&#39;wrappers&#39;])) { $input = $_GET[&#39;wrappers&#39;]; // 执行匹配操作前先转义可能引起问题的元字符 if (@preg_match($pattern, addslashes($input)) === 1) { echo &quot;&#39;wrappers&#39; 符合规定格式.&quot;; } else { echo &quot;&#39;wrappers&#39; 不符合规定格式.&quot;; } } ``` 上述例子展示了如何创建一个简单的正则表达式去校验 `wrappers` 是否只由大小写字母、数字和下划线组成。这里采用了 `addslashes()` 来防止某些特殊字符干扰正常的工作流程;同时注意到了 `@` 操作符被用来抑制潜在警告信息&mdash;&mdash;这是因为在某些情况下即使提供了有效输入也可能触发错误报告(比如传递了一个非字符串类型的变量给 `preg_match()`)。不过需要注意的是,虽然这种方法可以在一定程度上提高安全性,但它并不能完全消除风险,所以在生产环境中应该考虑更严格的输入过滤措施[^3]。 #### 关键点总结 - **不要让不受信任方决定完整的正则表达式**:应固定好一部分规则,仅允许有限度的变化。 - **始终对动态成分做适当编码/转义**:确保任何外部提供的片段不会破坏原有逻辑结构。 - **谨慎对待返回结果**:考虑到不同版本间行为差异等因素的影响,建议采用严格相等运算符 (`===`) 对比 `preg_match()` 输出的结果以获得最准确的状态判断[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值