HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > PHP
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Циклический битовый сдвиг в PHP
  #1  
Старый 03.06.2010, 19:35
slesh
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
С нами: 10097606

Репутация: 3349


По умолчанию Циклический битовый сдвиг в PHP

Очень нужно реализовать на PHP функцию циклического сдвига 32 битного числа.

в ассемблере просто всё - ror/rol а в PHP такого нет.
Вообще нашел только << и >> но это не циклический сдвиг.
Пытался сам реализовать через операции
$k = $k >> 3 + $k << 29;

В других языках (компилируемых) такое прокатилобы, а вот в PHP почемуто не пашет.
 
Ответить с цитированием

  #2  
Старый 03.06.2010, 19:46
Pashkela
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
С нами: 9649706

Репутация: 3338


По умолчанию

http://www.rinatous.com/blog/node/1.html
 
Ответить с цитированием

  #3  
Старый 03.06.2010, 19:52
slesh
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
С нами: 10097606

Репутация: 3349


По умолчанию

и? В чем смысл того, что ты дал? Там рассматриваются непосредственно операции над битами, это есть в любой доке по PHP
А тут нужно именно циклический сдвиг
 
Ответить с цитированием

  #4  
Старый 03.06.2010, 20:15
slesh
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
С нами: 10097606

Репутация: 3349


По умолчанию

фуф. вопрос решил сам. почемуто такое стало работать
$k = ($k << 29) + ($k >> 3);
и в одном месте chr() забыл

Последний раз редактировалось slesh; 03.06.2010 в 20:19..
 
Ответить с цитированием

  #5  
Старый 03.06.2010, 20:29
roxblnfk
Познающий
Регистрация: 07.02.2010
Сообщений: 70
С нами: 8557551

Репутация: 56
Post

Такое работает не при всех вариантах. Если левый бит равен 1, то заливка слева после смещения будет единицами, что при сложении не допустимо..
Написал код (про моём тестировании всё нормально):
PHP код:
$k=bindec('11111100110011001100110011000000');
echo 
sprintf('%032b',$k).'<br>';
for(
$a=1;$a<=32;$a++){
    
$b=32-$a;
    
$s = (($k >> $a) & ~(-pow(2,$b)))^($k << $b);
    echo 
sprintf('%032b',$s).'<br>';

Результат:
Цитата:
11111100110011001100110011000000
01111110011001100110011001100000
00111111001100110011001100110000
00011111100110011001100110011000
00001111110011001100110011001100
00000111111001100110011001100110
00000011111100110011001100110011
10000001111110011001100110011001
11000000111111001100110011001100
01100000011111100110011001100110
00110000001111110011001100110011
10011000000111111001100110011001
11001100000011111100110011001100
01100110000001111110011001100110
00110011000000111111001100110011
10011001100000011111100110011001
11001100110000001111110011001100
01100110011000000111111001100110
00110011001100000011111100110011
10011001100110000001111110011001
11001100110011000000111111001100
01100110011001100000011111100110
00110011001100110000001111110011
10011001100110011000000111111001
11001100110011001100000011111100
01100110011001100110000001111110
00110011001100110011000000111111
10011001100110011001100000011111
11001100110011001100110000001111
11100110011001100110011000000111
11110011001100110011001100000011
11111001100110011001100110000001
11111100110011001100110011000000
При использовании твоего кода:
Цитата:
11111100110011001100110011000000
11111110011001100110011001100000
11111111001100110011001100110000
11111111100110011001100110011000
11111111110011001100110011001100
11111111111001100110011001100110
11111111111100110011001100110011
01111111111110011001100110011001
10111111111111001100110011001100
01011111111111100110011001100110
00101111111111110011001100110011
10010111111111111001100110011001
11001011111111111100110011001100
01100101111111111110011001100110
00110010111111111111001100110011
10011001011111111111100110011001
11001100101111111111110011001100
01100110010111111111111001100110
00110011001011111111111100110011
10011001100101111111111110011001
11001100110010111111111111001100
01100110011001011111111111100110
00110011001100101111111111110011
10011001100110010111111111111001
11001100110011001011111111111100
01100110011001100101111111111110
00110011001100110010111111111111
10011001100110011001011111111111
11001100110011001100101111111111
11100110011001100110010111111111
11110011001100110011001011111111
11111001100110011001100101111111
11111001100110011001100110000000
как видно в первых строках нули не появляются слева

Последний раз редактировалось roxblnfk; 03.06.2010 в 20:34.. Причина: Добавил результ
 
Ответить с цитированием

  #6  
Старый 03.06.2010, 21:18
desTiny
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
С нами: 10139366

Репутация: 1502


По умолчанию

Цитата:
Сообщение от slesh  
фуф. вопрос решил сам. почемуто такое стало работать
$k = ($k << 29) + ($k >> 3);
ну да, надо скобки ставить. и в сях вообще-то тоже надо. У сдвигов приоритет выше (вроде) только чем у присваивания.
И лучше не + писать, а |.
__________________
Bedankt euch dafür bei euch selbst.

H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ
 
Ответить с цитированием
Ответ



Предыдущая тема Следующая тема
Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Books PSalm69 Избранное 273 13.02.2016 01:24
Books PHP FRAGNATIC PHP 186 21.02.2010 02:41



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.