Как мне выполнить правильный сдвиг вправо без знака в PHP?
Возможно ли получить одинаковые результаты в PHP и Javascript?
Пример:
Javascript-код
<script>
function urshift(a, b)
{
return a >>> b;
}
document.write(urshift(10,3)+"<br />");
document.write(urshift(-10,3)+"<br />");
document.write(urshift(33, 33)+"<br />");
document.write(urshift(-10, -30)+"<br />");
document.write(urshift(-14, 5)+"<br />");
</script>
Вывод:
1
536870910
16
1073741821
134217727
PHP
function uRShift($a, $b)
{
if ($a < 0)
{
$a = ($a >> 1);
$a &= 2147483647;
$a |= 0x40000000;
$a = ($a >> ($b - 1));
} else {
$a = ($a >> $b);
}
return $a;
}
echo uRShift(10,3)."<br />";
echo uRShift(-10,3)."<br />";
echo uRShift(33,33)."<br />";
echo uRShift(-10,-30)."<br />";
echo uRShift(-14,5)."<br />";
Вывод:
1
536870910
0
0
134217727
Возможно ли получить те же результаты?
Ближайшая функция к тому, что я хочу, находится здесь:
Функция сдвига вправо без знака не работает для отрицательного ввода
Спасибо за помощь.
3
2 answers
Попробуйте эту функцию:
function unsigned_shift_right($value, $steps) {
if ($steps == 0) {
return $value;
}
return ($value >> $steps) & ~(1 << (8 * PHP_INT_SIZE - 1) >> ($steps - 1));
}
Вывод, основанный на вашем примере кода:
1
536870910
16
1073741821
134217727
1
Author: silkfire, 2014-08-23 15:28:06
Наконец, я думаю, что нашел решение, не знаю почему, но этот код работает для меня:
function uRShift($a, $b)
{
if ($b > 32 || $b < -32) {
$m = (int)($b/32);
$b = $b-($m*32);
}
if ($b < 0)
$b = 32 + $b;
if ($a < 0)
{
$a = ($a >> 1);
$a &= 2147483647;
$a |= 0x40000000;
$a = ($a >> ($b - 1));
} else {
$a = ($a >> $b);
}
return $a;
}
0
Author: Kamil Wiśniewski, 2014-08-24 01:11:38