PHP правильный сдвиг и отрицательный результат?


Я столкнулся с проблемой при преобразовании некоторого кода C в PHP, в частности, при использовании оператора сдвига вправо.

изменить: в следующих примерах бит =0;

Исходный код C:

p->param->outBits[bytePtr++] |= codeword >> (9 + bit);

PHP-код:

$outBits[$bytePtr++] |= $codeword >> (9 + $bit);

Если я начну с codeword, равным 130728, в C я получу ожидаемый результат -1. В PHP я получаю 255. Я понимаю, что это как-то связано с различиями в арифметических/логических сдвигах, и отрицательный знак не вводится в результате MSBS остаются на нуле.

Существует ли "быстрый" способ выполнения описанного выше в PHP, который не предполагает переноса? например, с помощью базовой арифметики или аналогичного, это даст мне ожидаемый ответ?

Author: richsage, 2009-11-15

1 answers

Ваша проблема в том, что PHP не имеет типа byte, у него есть только integer, который обычно составляет 32 бита (не 8), поэтому, если вам действительно нужно отрицательное значение (биты в любом случае правильные, потому что без знака 255 совпадает со знаком -1), то вам, вероятно, следует добавить недостающие 24 или использовать арифметику для восстановления отрицательного значения (255 равно -1, 254 равно -2 и т. Д. Т.Е. 256 -x = -x).

 3
Author: inkredibl, 2009-11-16 09:28:02