PHP如何从字节提取前2位生成新字节及字符串位运算问题
PHP字节位运算操作指南
位运算操作需求
实现从单个字节的二进制位中提取指定位数,例如提取字节的高2位,将其转换为新字节(提取的位放在低位,高位补0),效果类似从十进制数12345678中提取前两位12,生成新的十进制字节值12(二进制00001100)。
示例问题与坑点
以下是PHP字符串位运算的常见错误示例:
$char = 'z'; // 对应ASCII值122,二进制为0111 1010 $b = $char & '?'; // '?'对应ASCII值63,二进制为0011 1111 echo $b; // $b的值为58,输出为':' // 若错误使用整数与字符串直接运算: $b = $char & 63; // 运算结果为0 echo $b; // 输出0,原因是字符串$char转换为整数时被转为0,0&63=0
关键说明
- 位运算的操作对象是字节的二进制位,而非字符串或其表面的十进制数值。
- PHP中字符串无法直接执行
>> 1这类移位操作,必须先转换为对应整数再操作。
正确实现方式
字符串转整数后执行位运算
处理单个字符的位运算,需先用ord()获取字符的ASCII整数值,运算完成后再用chr()转换回字符:
$char = 'z'; $charInt = ord($char); // 获取'z'的ASCII值122 $b = $charInt & 63; // 122 & 63 = 58(二进制00111010) echo chr($b); // 输出正确结果':'
提取字节中指定的位
以提取字节的高2位为例:
$byteValue = 122; // 二进制01111010 // 提取高2位:右移6位,将高2位移至低位 $extractedHigh = $byteValue >> 6; // 结果为1(二进制00000001) // 提取低2位:与二进制11(十进制3)按位与 $extractedLow = $byteValue & 3; // 结果为2(二进制00000010)
批量处理字符串中的所有字节
对多字节字符串的每个字符进行位运算处理:
$str = "example"; $processedStr = ""; foreach (str_split($str) as $char) { $int = ord($char); // 提取高2位并转为新字节 $extracted = $int >> 6; $processedStr .= chr($extracted); } // $processedStr即为处理后的字符串
内容的提问来源于stack exchange,提问作者Daro from Poland
相关产品推荐
相关产品推荐

