繁体   English   中英

如何在php中按位移动字符串?

[英]how to bitwise shift a string in php?

我想在 PHP 中移动一个 16 位变量。 但我的代码不起作用。 它只是移动每个字节的最低半字节。 并保持 The High 半字节不变。 第一个和第三个半字节移动很好。 但第二和第四不是。

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];
 } 

与 C 不同,在 PHP 中通过索引取消引用字符串不会产生数字变量,而是产生 1 字节的字符串:

$str = 'as';
var_dump($str[0]); 
// prints: string(1) "a"

字符串不受按位运算的影响。 或者更准确地说:它们在执行按位运算之前被解析为整数。 这就是为什么如果你向它传递一个包含数字字符的字符串,它会显示为“移动最低半字节”,而实际上它做了完全不同的事情:

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"

最后我发现应该将字符串更改为数字类型以移动它。 像这个:

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;
    }
}

按位运算符 << 或 >> 向左或向右


echo 1010<<2 ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM