ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
Циклический битовый сдвиг в PHP |

03.06.2010, 19:35
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
Циклический битовый сдвиг в PHP
Очень нужно реализовать на PHP функцию циклического сдвига 32 битного числа.
в ассемблере просто всё - ror/rol а в PHP такого нет.
Вообще нашел только << и >> но это не циклический сдвиг.
Пытался сам реализовать через операции
$k = $k >> 3 + $k << 29;
В других языках (компилируемых) такое прокатилобы, а вот в PHP почемуто не пашет.
|
|
|

03.06.2010, 19:46
|
|
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
Провел на форуме: 9220514
Репутация:
3338
|
|
http://www.rinatous.com/blog/node/1.html
|
|
|

03.06.2010, 19:52
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
и? В чем смысл того, что ты дал? Там рассматриваются непосредственно операции над битами, это есть в любой доке по PHP
А тут нужно именно циклический сдвиг
|
|
|

03.06.2010, 20:15
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
фуф. вопрос решил сам. почемуто такое стало работать
$k = ($k << 29) + ($k >> 3);
и в одном месте chr() забыл
Последний раз редактировалось slesh; 03.06.2010 в 20:19..
|
|
|

03.06.2010, 20:29
|
|
Познающий
Регистрация: 07.02.2010
Сообщений: 70
Провел на форуме: 217996
Репутация:
56
|
|
Такое работает не при всех вариантах. Если левый бит равен 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..
Причина: Добавил результ
|
|
|

03.06.2010, 21:18
|
|
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
Провел на форуме: 3008839
Репутация:
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
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|