Могу ли я узнать, как я могу сделать PHP >>>? Такие операторы недоступны в PHP, но доступны в Javascript.
Мне просто удалось найти функцию:
function zeroFill($a, $b) { $z = hexdec(80000000); if ($z & $a) { $a = ($a>>1); $a &= (~$z); $a |= 0x40000000; $a = ($a>>($b-1)); } else { $a = ($a>>$b); } return $a; }
но, к сожалению, он не работает отлично.
EG: -1149025787 >>> 0 Возврат Javascript 3145941509 PHP zeroFill () return 0
В два раза быстрее для отрицательных чисел с использованием десятичных двоичных преобразований
function zerofill($a,$b) { if($a>=0) return $a>>$b; if($b==0) return (($a>>1)&0x7fffffff)*2+(($a>>$b)&1); return ((~$a)>>$b)^(0x7fffffff>>($b-1));
Ваша функция не работает, потому что, когда $b == 0
, выражение
$a >> -1
будет оцениваться, который возвращает 0.
Предполагая 32-битные машины, вы можете добавить специальный случай:
if ($z & $a) { if ($b == 0) return $a + 0x100000000; else { ...
Не уверен, что это работает для php, мне удалось заставить его работать с C #.
int a, b, result; //Instead of result = a >>> b; //I do result = (int)((uint)a >> b);
Я нашел это, отлаживая код, который использует >>>
сравнивая его с версией C # кода, который я преобразовал из javascript. Пробовав с помощью b = 0
и используя научный калькулятор, чтобы увидеть результат hex / dec >>
и >>>
произвести javascript. Когда a
отрицательно, >>>
действительно делает aa как unsigned.
Не уверен, что это работает для всех сценариев, но для моего случая >>>
для хеширования md5. Имея возможность производить аналогичную продукцию, я вполне доволен результатом.
надеюсь, это поможет
Для 32-разрядных (PHP_INT_SIZE == 4) и 64-битных целых чисел (PHP_INT_SIZE == 8):
function SHR ($x, $c) { $x = intval ($x); // Because 13.5 >> 0 returns 13. We follow. $nmaxBits = PHP_INT_SIZE * 8; $c %= $nmaxBits; if ($c) return $x >> $c & ~ (-1 << $nmaxBits - $c); else return $x; }
Я много разбирался в этом, собрал более 11 версий из StackOverflow и проектов с открытым исходным кодом, ни один из них не работал. Но, наконец, я нашел решение.
Для более подробной информации, живые демонстрации, тесты и примеры проверяют мой вопрос и ответ:
Unsigned Right Shift / Zero-fill Right Shift в PHP (эквивалент Java / JavaScript)
function unsignedRightShift($a, $b) { if ($b >= 32 || $b < -32) { $m = (int)($b/32); $b = $b-($m*32); } if ($b < 0) { $b = 32 + $b; } if ($b == 0) { return (($a>>1)&0x7fffffff)*2+(($a>>$b)&1); } if ($a < 0) { $a = ($a >> 1); $a &= 2147483647; $a |= 0x40000000; $a = ($a >> ($b - 1)); } else { $a = ($a >> $b); } return $a; }
Я изучал веб-сайты и выходил со своей собственной функцией zerofill, основываясь на приведенном объяснении. Этот метод работает для моей программы.
Взгляни:
function zeroFill($a,$b) { if ($a >= 0) { return bindec(decbin($a>>$b)); //simply right shift for positive number } $bin = decbin($a>>$b); $bin = substr($bin, $b); // zero fill on the left side $o = bindec($bin); return $o; }
Это работает для меня
function RRR($a, $b){ return (int)((float)$a/pow(2,(int)$b)); }