Intereting Posts
Настройка веб-проекта PHP, инфраструктуры Отправка переменных с одной страницы PHP на другую Объединить массив без индекса ключа потери Получение всех записей, которые являются днем ​​рождения, сегодня в PostgreSQL Как добавить массив как свойство объекта в класс, объявленный в PHP-расширении? php imagick gif изменяет размер всех кадров Должен ли я использовать модель EAV? Ошибка $ .ajax не может поймать заброшенное исключение из php Выполнение команд hadoop в браузере Как прекратить отправку сообщений в mysql, если база данных содержит определенный идентификатор? Рекомендуемый способ безопасного использования пользовательского порядка в выражении SQL Метод Joomla 1.6 JCategories :: get () создает «PHP Fatal error: Allowed memory outed» в пользовательском компоненте MVC Нужно ли откатываться, если фиксация завершается неудачей? DOM Parser для выделения ключевых слов, не работающих angularJs POST данные в $ _POST для php

PHP-эквивалент javascript >>> shift right с нулевыми заполняющими побитовыми операторами?

Могу ли я узнать, как я могу сделать 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)); }