echo ($a&0x7f) + ($a&0x80?-128:0);
edit это имитирует то, что на самом деле должно происходить для 8-битного значения со знаком. Когда MSB (бит 7) равен нулю, у нас просто есть значение этих 7 бит. Когда MSB установлен в 1, мы начинаем с -128 (т.е. 1000000b == -128d
).
Вы также можете использовать тот факт, что PHP использует целочисленные значения внутри:
$intsize = 64; // at least, here it is...
echo ($a<<($intsize-8))/(1<<($intsize-8));
поэтому вы сдвигаете MSB байта в позицию MS для int, как это видит php, т.е. вы добавляете 56 нулевых бит справа Деление «снимает» эти биты, сохраняя при этом знак значения.