как поразрядно сдвинуть строку в php?

я хочу сдвинуть 16-битную переменную в Php.
но мой код не работает.
это просто сдвигает самый низкий кусочек каждого байта. и оставить Высокий клев без изменений.
первый и третий клев смещается нормально.
но второго и четвертого нет.

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

0

Решение

В отличие от 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'

Вы должны явно привести 1-байтовые строки к байт-кодам, вызвав ord а затем обратно по телефону 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"
0

Другие решения

В конце концов я выяснил, что следует изменить строку на тип числа, чтобы сместить ее. как этот:

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

По вопросам рекламы [email protected]