- 1
- 2
- 3
int rotate(int a, int k) {
return (a << k) | (a >> (32-k));
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+131
int rotate(int a, int k) {
return (a << k) | (a >> (32-k));
}
Вращение на k бит влево.
kipar 10.07.2013 15:15 # 0
bormand 10.07.2013 15:52 # −1
inkanus-gray 10.07.2013 15:53 # −2
bormand 10.07.2013 15:57 # −1
Так вот. В обоих случаях код будет работать корректно, несмотря на UB.
P.S. Да и кому в здравом уме надо вертеть регистр на 0 бит?
inkanus-gray 10.07.2013 16:03 # 0
bormand 10.07.2013 16:05 # −1
anonimb84a2f6fd141 10.07.2013 16:38 # +2
Sha-1?
bormand 10.07.2013 16:48 # 0
inkanus-gray 10.07.2013 15:48 # 0
bormand 10.07.2013 15:54 # +1
Psionic 10.07.2013 16:05 # −1
anonimb84a2f6fd141 10.07.2013 19:24 # −1
Stertor 10.07.2013 20:08 # −4
Psionic 10.07.2013 16:03 # +1
bormand 10.07.2013 16:08 # −2
inkanus-gray 10.07.2013 16:24 # −2
bormand 10.07.2013 16:25 # +1
А если он signed - то это и не вращение, а НЁХ из-за знакового расширения в >>.
inkanus-gray 10.07.2013 16:27 # −1
Вывод: знаковые числа не нужны.
inkanus-gray 10.07.2013 16:11 # −5
Обычный сдвиг — это умножение/деление на степени двойки. Сдвиг с расширением знака — для питухов, которым зачем-то нужны отрицательные числа.
А зачем нужен циклический сдвиг? Для доступа к разрядом битовых полей? Но ведь у нас есть bt/bsf/bsr.
bormand 10.07.2013 16:16 # +1
Для криптовалок. Там почти в каждом алгоритме циклические сдвиги.
anonimb84a2f6fd141 10.07.2013 16:42 # +1
inkanus-gray 10.07.2013 17:42 # 0
anonimb84a2f6fd141 10.07.2013 18:17 # 0
Во первых, одну, во вторых, константное время -> противодействие тайминговым атакам.
eth0 10.07.2013 19:04 # −2
Psionic 10.07.2013 16:38 # 0
anonimb84a2f6fd141 10.07.2013 16:43 # 0
3.14159265 10.07.2013 16:44 # −1
Это не жаба и не шарп. int в сишке может принимать любой размер.
bormand 10.07.2013 16:46 # −2
3.14159265 10.07.2013 16:51 # −2
http://govnokod.ru/13355#comment187236
bormand 10.07.2013 16:57 # −1
13358
3.14159265 10.07.2013 17:12 # −2
anonimb84a2f6fd141 10.07.2013 17:03 # −1
anonimb84a2f6fd141 10.07.2013 16:58 # −1
bormand 10.07.2013 17:08 # −2
inkanus-gray 10.07.2013 17:55 # +1
Ну разве нормально, что > и >> могут обозначать как знаковые (jg, sar), так и беззнаковые (ja, shr) операции?
bormand 10.07.2013 18:01 # 0
inkanus-gray 10.07.2013 18:05 # −2
Скажете, что операция выбирается исходя из типа аргументов? Во что скомпилируется?
roman-kashitsyn 10.07.2013 18:11 # +3
bormand 10.07.2013 18:17 # −1
inkanus-gray 10.07.2013 18:19 # −1
Stertor 10.07.2013 21:07 # −3
Возможно, речь идет о "unsigned" ? Что-то я задумался.
psycho-coder 11.07.2013 12:55 # −1
Vindicar 10.07.2013 19:33 # −3
anonimb84a2f6fd141 10.07.2013 20:59 # 0
Stertor 10.07.2013 21:04 # −6
На низких языках хорошо кодить в группе; одна голова хорошо, а несколько -лучше, если одна ошибется, другие исправят. А если кодишь один, то можно сильно извращаться(( это угнетает.
anonimb84a2f6fd141 10.07.2013 21:05 # −2
psycho-coder 11.07.2013 13:05 # −2
Одна голова ошиблась, остальные подхватили ошибку и понесли дальше. Им есть чем занятся, а не ваш гк править.
Stertor 11.07.2013 13:24 # −6
>>остальные подхватили ошибку и понесли дальше
Вот, может, пригодится.
http://ekowc.ru/assenization
psycho-coder 11.07.2013 13:26 # −1
Stertor 11.07.2013 13:35 # −3
Поменяю местами все двери дома )
Если бы ты игнорил меня с самого начала, а не кидал быдлореплики, было бы куда лучше, на будущее тебе.
Stertor 11.07.2013 13:42 # −8
Stertor 11.07.2013 13:51 # −7
krypt 11.07.2013 15:45 # 0
Пардон, не удержался.
Stertor 11.07.2013 16:54 # −2
Stertor 11.07.2013 17:03 # −3
krypt 11.07.2013 17:23 # 0
Stertor 11.07.2013 17:41 # −1
anonimb84a2f6fd141 10.07.2013 21:07 # −1
roman-kashitsyn 11.07.2013 11:44 # +1
Даже сишка поддерживает основные виды абстракций:
- абстракция данных (forward declaration + функции-акцессоры)
- абстракция процедур (функции, принимающие на вход функции? пожалуйста. С возвратом функций сложнее, ибо замыканий нема, царские методы в продакшене не катят).
- разделение интерфейса и реализации (яркий пример - ядрёный vfs)
Синтаксическая абстракция в попе, но её вообще мало кто поддерживает. Тут у сишки скорее плюс, ибо богомерзкий препроцессор.
Ну а что руками писать приходится, это да. Зато можно выточить в точности такой велик, какой хочется. И контроля над производительностью больше.
Впрочем, немного утомляет.
anonimb84a2f6fd141 11.07.2013 16:22 # +1
А чем указатели не замыкания?
> И контроля над производительностью больше.
Дык никто не говорит, что это не нужно вообще никогда, просто очень редко. Меньшее количество граблей важнее.
Vasiliy 11.07.2013 17:13 # +1
anonimb84a2f6fd141 11.07.2013 18:14 # 0
Так это уже проблемы работы с памятью, я б сказал.
Stertor 11.07.2013 17:54 # −2
Из протокола:
Программист не сдал вовремя заказ, потому, что умер посреди разработки.
Stertor 10.07.2013 21:09 # −5
P/S.
Чего вы его минусуете? Он прав.
anonimb84a2f6fd141 10.07.2013 20:46 # +1
superhackkiller1997 11.07.2013 00:26 # −1
__rold(); Питухи О5 не осилили сишку. stdint.h - uint32_t.
inkanus-gray 11.07.2013 01:22 # −1
unsigned long _lrotl(unsigned long, int);
И да, ни в C99, ни в C11 нет.
superhackkiller1997 11.07.2013 01:35 # −5
Такие же штуки в гцц есть для всех нормальных архитектур. Суть в том, что 95% их не юзают, да и не знают о них - вот я пролил свет на них.
Основной посыл был в stdint, а не __rold();
inkanus-gray 11.07.2013 11:58 # −3
Да, в либц перечисленных функций нет, потому что они встроены в компилятор. Оно и логично: зачем линковать такую короткую функцию, когда её можно сделать инлайном?
_rotl, _rotr, _lrotl, _lrotr есть и у Микрософта, и у Борланда, и у Ваткома... Только одна проблема: при циклическом сдвиге нужно точно знать размер операнда, а в разных версиях сишки размер инта разный. Где восьми- и шестнадцатибитный циклический сдвиг, например? Можно, конечно, написать _rotl(x | (uint32_t)x << 16, k) & 0xffff, но такой код похож на говно, поэтому лучше будет (a << k) | (a >> (16-k)) в надежде, что gcc -O2 автоматически подставит ROL при правильном типе аргумента.
P.S. А как у гцц с поддержкой _rotl/_rotr на неинтеловских процессорах?
superhackkiller1997 11.07.2013 15:45 # 0
Это даже не функция гцц, а интринсики, которые должны быть к каждой архитектуре, которую держит конпелятор.
>Да, в либц перечисленных функций нет, потому что они встроены в компилятор. Оно и логично: зачем линковать такую короткую функцию, когда её можно сделать инлайном?
Щито ты несёшь - хедеры тоже часть либц - иди кури либц. Там половина функций инлайновые.
>Только одна проблема: при циклическом сдвиге нужно точно знать размер операнда, а в разных версиях сишки размер инта разный.
Если у тебя на x86( ты видишь там написанно x86intrin) инт 8байтный - твой конпелятор говно и выкинь его в форточку. Да и вообще, есть stdint, который маздайщики не осилили по причинет того, что их говноконпелятор не запилил с99.
>Где восьми- и шестнадцатибитный циклический сдвиг, например?
В питухе. Ты думаешь там просто так написанно __rold()? Там есть __rolb(), __rolw(), __rolq().
>Можно, конечно, написать _rotl(x | (uint32_t)x << 16, k) & 0xffff, но такой код похож на говно, поэтому лучше будет (a << k) | (a >> (16-k)) в надежде
Ты несёшь херню.
>что gcc -O2 автоматически подставит ROL при правильном типе аргумента.
Он итак подставит. На все из __rol*();
>P.S. А как у гцц с поддержкой _rotl/_rotr на неинтеловских процессорах?
#define _lrotl(a,b) __rolq((a), (b))
#define _lrotr(a,b) __rorq((a), (b))
Это тебе не питух.
crastinus 11.07.2013 05:35 # −2
Stertor 11.07.2013 13:45 # −5
Stertor 11.07.2013 17:52 # −2