Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Побитовые операции в PHP


Автор: Jema 14.1.2010, 23:21
Ребята - уже два часа мучаю поиск и читаю битовую арифметику. Не могу разобраться - спасайте.
Переписываю пару функций с javascript в PHP и застопорился.
В javascript есть следующие операторы:
Код

Левый сдвиг    a << b    Сдвигает двоичное представление a на b битов влева, добавляя справа нули.
Правый сдвиг, переносящий знак    a >> b    Сдвигает двоичное представление a на b битов вправо, отбрасывая сдвигаемые биты.
Правый сдвиг с заполнением нулями    a >>> b    Сдвигает двоичное представление a на b битов вправо, отбрасывая сдвигаемые биты и добавляя нули слева.

В PHP есть следующие аналоги:
Код

$a << $b    Сдвиг влево     Все биты переменной $a сдвигаються на $b позиций влево (каждая позиция подразумевает 'умножение на 2')
$a >> $b    Сдвиг вправо     Все биты переменной $a сдвигаються на $b позиций вправо (каждая позиция подразумевает 'деление на 2')

Оператор >>> в PHP мною не обнаружен.
Справедлива ли замена >>>  на abs($a >> $b) в  PHP?

Автор: Simpliest 15.1.2010, 00:10
Цитата(Jema @  14.1.2010,  22:21 Найти цитируемый пост)
Правый сдвиг, переносящий знак    a >> b    Сдвигает двоичное представление a на b битов вправо, отбрасывая сдвигаемые биты.
Правый сдвиг с заполнением нулями    a >>> b    Сдвигает двоичное представление a на b битов вправо, отбрасывая сдвигаемые биты и добавляя нули слева.

Я откровенно говоря не уловил разницы между этими двумя операциями.

В первом случае разве не нули слева появляются?

В смысле что 01001 >> 1 =  00100 и это эквивалентно 1001 >> 1 = 100

Или где-то в языках высокого уровня учитывается битовая разрядность чисел? и 00100 != 100 ? В честь чего?

Добавлено через 1 минуту и 7 секунд
Аааа. жесть
Цитата
a >> b Арифметический сдвиг вправо Сдвигает двоичное представление левого операнда вправо на количество бит, заданное вторым операндом. Освобождающиеся слева биты заполняются старшим (знаковым) битом. a >>> b Логический сдвиг вправо Сдвигает двоичное представление левого операнда вправо на количество бит, заданное вторым операндом. Освобождающиеся слева биты заполняются нулями. 

Как говориться читайте ПРАВИЛЬНЫЕ мануалы.

Добавлено через 1 минуту и 38 секунд
http://wdh.suncloud.ru/js04.htm

Добавлено через 10 минут и 8 секунд
А вот что говориться в PHP
Цитата

$a >> $b  Shift right Shift the bits of $a $b steps to the right (each step means "divide by two")  

Bit shifting in PHP is arithmetic. Bits shifted off either end are discarded. Left shifts have zeros shifted in on the right while the sign bit is shifted out on the left, meaning the sign of an operand is not preserved. Right shifts have copies of the sign bit shifted in on the left, meaning the sign of an operand is preserved. 


Цитата(Jema @  14.1.2010,  22:21 Найти цитируемый пост)
Справедлива ли замена >>>  на abs($a >> $b) в  PHP? 

да

Автор: Jema 15.1.2010, 00:43
спасибо
проверяю как-раз

Автор: Simpliest 15.1.2010, 09:19
проверять легко

Код

$a = -1*PHP_INT_MAX

var_dump(decbin($a));
for ($b = 1;$b <33; $b++) {
    var_dump(decbin(abs($a >> $b)));
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)