- 1
- 2
- 3
unsigned b;
unsigned char num;
b = ((b & ((1 << num) - 1)) << ((sizeof(b) << 3) - num)) | (b >> num);
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+141
unsigned b;
unsigned char num;
b = ((b & ((1 << num) - 1)) << ((sizeof(b) << 3) - num)) | (b >> num);
Долго не мог понять, что оно делает.
byss 04.03.2011 00:07 # −6
TheCalligrapher 04.03.2011 00:50 # +1
guest 15.04.2011 09:32 # 0
absolut 04.03.2011 00:51 # +1
TheCalligrapher 04.03.2011 00:55 # +3
b = (b << (CHAR_BIT * sizeof b - num)) | (b >> num);
Видно, что общую идею он понимал. Но зачем он занимался каким-то дополнительным максированием в "левой" части (вот это вот `((1 << num) - 1)`) - не ясно. Говнокод, в общем.
А замена умножения на сдвиг - говнокод втройне.
3.14159265 04.03.2011 10:47 # +1
Это еще почему?
ctm 04.03.2011 12:06 # +1
3.14159265 04.03.2011 12:46 # +1
>нормальный компилятор умножать на 8 сам не будет.
я как-то об этом и не подумал
TheCalligrapher 04.03.2011 21:22 # +3
В такой ситуации заниматься идиотизмом и пытаться загнать компилятор "в сдвиг" - хрестоматийная классика говнокодирования.
ctm 05.03.2011 07:52 # 0
919 операций подряд без цикла (ну так накопировались инклуды). Нужно сделать eax = ecx * 8
// 214000 раз в сек.
mov eax, 8
mul ecx
// 260000 раз в сек.
mov eax, ecx
shl eax, 3
// 226000 раз в сек.
lea eax, [ecx * 8]
машина HP Elitebook 8440p, XP SP3, оптимизации компилятора, понятное дело, отключены.
gegMOPO4 05.03.2011 12:21 # 0
TarasB 04.03.2011 10:48 # −6
ctm 04.03.2011 11:54 # −2
а если шутка, то смайл ставьте:)
TarasB 04.03.2011 13:31 # +3
absolut 04.03.2011 13:48 # −1
ctm 04.03.2011 15:50 # 0
TarasB 04.03.2011 15:53 # 0
TarasB 04.03.2011 16:06 # −3
Надо было написать (b &!(1 << num - 1)) >> num
gegMOPO4 04.03.2011 20:17 # +1
2) Приоритет "-" выше, чем "<<".
TarasB 04.03.2011 20:34 # −3
2) А вот это ещё одна хрень языка, я не знал про такую. Сдвиг же по функционалу схож с умножением/делением, которые более приоритетны, чем плюс/минус.
absolut 04.03.2011 22:07 # +3
TarasB 05.03.2011 09:47 # −4
nil 12.03.2011 19:08 # 0