如何按位移动 php 中的字符串?
how to bitwise shift a string in php?
我想在 Php 中移动一个 16 位变量。
但我的代码不工作。
它只是移动每个字节的最低半字节。并保持高半字节不变。
第一和第三个半字节移位很好。
但是第二个和第四个不是。
public static function leftShift2Byte($in){
$strarr = str_split($in);
if($strarr[1]>chr(127)){
$strarr[1] = $strarr[1]<<1;
$strarr[0] = $strarr[0]<<1;
$strarr[0]++;
}else{
$strarr[1] = $strarr[1]<<1;
$strarr[0] = $strarr[0]<<1;
}
return $strarr[0].$strarr[1];
}
最后我发现应该将字符串更改为 The number 类型才能移动它。像这个:
public function nextChildCode($childs){
$mask=bindec('0000000000000001');
$counter=0;
$childNum=ord($childs{1})+( ord($childs{0})*256 );
//$childNum=32767;
while((($mask & $childNum)!=0)&& $counter<17){
$mask=$mask<<1;
$counter++;
}
if($counter<16){
return dechex($counter) ;
}else{
return NULL;
}
}
与 C 不同,在 PHP 中通过索引取消引用字符串不会生成数字变量,而是生成 1 字节的字符串:
$str = 'as';
var_dump($str[0]);
// prints: string(1) "a"
字符串不受按位运算的影响。或者更准确地说:在执行按位运算之前,它们被解析为整数。这就是为什么如果你向它传递一个包含数字字符的字符串,它会显示为 'shifting the lowest nibble',而实际上它做了完全不同的事情:
var_dump(leftShift2Byte('01'));
// prints: string(2) "02"
// That is:
// - '0' parsed as integer to 0, shifted 1 bit, got 0, concatenated as '0'
// - '1' parsed as 1, shifted to 2, concatenated as '2'
您必须通过调用 ord
将 1 字节字符串显式转换为字节码,然后通过调用 chr
:
返回
function leftShift2ByteOrd($in){
$strarr = str_split($in);
$numarr = array_map('ord', $strarr);
$carry = $numarr[1] | 0x80;
$numarr[1] = $numarr[1] << 1;
$numarr[0] = $numarr[0] << 1;
if ($carry) {
$numarr[0]++;
}
return chr($numarr[0]) . chr($numarr[1]);
}
var_dump(leftShift2ByteOrd('01'));
// prints: string(2) "ab"
按位运算符 << 或 >> 向左或向右
echo 1010<<2 ;
我想在 Php 中移动一个 16 位变量。 但我的代码不工作。 它只是移动每个字节的最低半字节。并保持高半字节不变。 第一和第三个半字节移位很好。 但是第二个和第四个不是。
public static function leftShift2Byte($in){
$strarr = str_split($in);
if($strarr[1]>chr(127)){
$strarr[1] = $strarr[1]<<1;
$strarr[0] = $strarr[0]<<1;
$strarr[0]++;
}else{
$strarr[1] = $strarr[1]<<1;
$strarr[0] = $strarr[0]<<1;
}
return $strarr[0].$strarr[1];
}
最后我发现应该将字符串更改为 The number 类型才能移动它。像这个:
public function nextChildCode($childs){
$mask=bindec('0000000000000001');
$counter=0;
$childNum=ord($childs{1})+( ord($childs{0})*256 );
//$childNum=32767;
while((($mask & $childNum)!=0)&& $counter<17){
$mask=$mask<<1;
$counter++;
}
if($counter<16){
return dechex($counter) ;
}else{
return NULL;
}
}
与 C 不同,在 PHP 中通过索引取消引用字符串不会生成数字变量,而是生成 1 字节的字符串:
$str = 'as';
var_dump($str[0]);
// prints: string(1) "a"
字符串不受按位运算的影响。或者更准确地说:在执行按位运算之前,它们被解析为整数。这就是为什么如果你向它传递一个包含数字字符的字符串,它会显示为 'shifting the lowest nibble',而实际上它做了完全不同的事情:
var_dump(leftShift2Byte('01'));
// prints: string(2) "02"
// That is:
// - '0' parsed as integer to 0, shifted 1 bit, got 0, concatenated as '0'
// - '1' parsed as 1, shifted to 2, concatenated as '2'
您必须通过调用 ord
将 1 字节字符串显式转换为字节码,然后通过调用 chr
:
function leftShift2ByteOrd($in){
$strarr = str_split($in);
$numarr = array_map('ord', $strarr);
$carry = $numarr[1] | 0x80;
$numarr[1] = $numarr[1] << 1;
$numarr[0] = $numarr[0] << 1;
if ($carry) {
$numarr[0]++;
}
return chr($numarr[0]) . chr($numarr[1]);
}
var_dump(leftShift2ByteOrd('01'));
// prints: string(2) "ab"
按位运算符 << 或 >> 向左或向右
echo 1010<<2 ;