Битовые операции в ПХП (>>>)

cDLEON

Онанист РНРСlub
Битовые операции в ПХП (>>>)

Этот вопрос я уже задавал, но задам ещё раз, вот эта ф-я:
PHP:
function bits($num, $count) 
	{
	if ($count > 0) 
		{ 
	        $num >>= 1; 
	        if ($num & 0x80000000) 
			{ 
			$num &= 0x7fffffff; 
        		} 
        	$num >>= $count - 1; 
		} 
	else 
		{ 
        	$num <<= -$count; 
    		} 
	return $num; 
	}
заменяет, флеш комманду(>>>), для ПХП, но работает не совсем правильно, не всегда результат во флеш, совподает с результатом на ПХП, например при попытке сместиться на 32 бита, ПХП возвращает ноль, а флеш нормальное число, ПОМОГИТЕ работа горит!!!!!
 

cDLEON

Онанист РНРСlub
Да нет там вроде бы не чего..., мне ф-я реальная нужна =)
 

Crazy

Developer
Re: Битовые операции в ПХП (>>>)

Автор оригинала: cDLEON
например при попытке сместиться на 32 бита, ПХП возвращает ноль, а флеш нормальное число
Интересно... И какое же это ненулевое число может получиться, если двоичное число, имеющее единицу только в младшем разряде, сдвинуть вправо на 32 бита?
 

cDLEON

Онанист РНРСlub
спроси у флеш разработчиков =), или сам попробуй подставить это всё..., там не обязательно 1-ца быть должна....
ПХП не зависимо какое там число выдаёт ноль...
 

Crazy

Developer
cDLEON, давай подумаем вместе. Пронумеруем разряды справа налево от 0 до 31. При сдвиге вправо на 1 бит значение 0 бита отбрасывается, на его место пишется 1-й, на место 1-го -- второй, на место 2-го -- третий ... на место 30-го -- 31-й, а сам 31-й заполняется нулем. Так?

Вопрос: что будет, если сделать это 32 раза? Возьми листочек и карандаш.
 

cDLEON

Онанист РНРСlub
млин возьми открой флеш и попробуй сам для меня самого то было смешно....
 

Crazy

Developer
cDLEON, МНЕ твой флэш нахрен не сдался. Тебя интересует решение -- ты и возьми бумажку.

-~{}~ 26.09.05 08:55:

Последняя попытка помочь осознать: у меня описано, как работает твоя функция. >>> отличается от твоей функции тем, что не выбрасывает младший бит, а... А что она с ним делает -- ты узнаешь в документации.

В этом и заключается основная ошибка твоей функции.
 

Profic

just Profic (PHP5 BetaTeam)
Хе-хе, функция как раз таки не его, а моя :). Написана по его "описанию" оператора >>>. Видимо описание было кривым :).
 

Crazy

Developer
Profic, описание операторов >> и >>> определенно должно различаться. :) Кстати, а как именно он это описал?
 

Crazy

Developer
Profic, он тебя обманул:

Нужен код для побитового смещения вправо(влево) без знака, подобно как работает в флеше оператор: >>> или <<<
Операторы >>> и <<< -- это битовое ВРАЩЕНИЕ, а не смещение.

Ты действительно написал то, что он попросил. Но это не имеет никакого отношения к тому, что делают <<< и >>> в ECMAscript.
 

Profic

just Profic (PHP5 BetaTeam)
Гат (с) :)
Хм. Интересно:
>>> (Zero-Fill Right Shift)
This operator shifts the first operand the specified number of bits to the right. Excess bits shifted off to the right are discarded. Zero bits are shifted in from the left.
(с) JavaScript 1.5 Reference Manual
Причем про <<< вообще ни слова :)
 

Crazy

Developer
Любопытно. Не исключено я ощибаюсь и где-то >>> означает не вращение. Но "zero-filled right shift" на 32 бита в 32-битном числе всегда даст ноль. Без вариантов.
 

Profic

just Profic (PHP5 BetaTeam)
Но "zero-filled right shift" на 32 бита в 32-битном числе всегда даст ноль. Без вариантов
Это да.
Но если это сдвиг с переносом, то тогда каким боком в примере из прошлой темы у него из -1 получается 2^31-1? Ничего не понимаю...
 
Сверху