- 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);
Долго не мог понять, что оно делает.
b = (b << (CHAR_BIT * sizeof b - num)) | (b >> num);
Видно, что общую идею он понимал. Но зачем он занимался каким-то дополнительным максированием в "левой" части (вот это вот `((1 << num) - 1)`) - не ясно. Говнокод, в общем.
А замена умножения на сдвиг - говнокод втройне.
Это еще почему?
>нормальный компилятор умножать на 8 сам не будет.
я как-то об этом и не подумал
В такой ситуации заниматься идиотизмом и пытаться загнать компилятор "в сдвиг" - хрестоматийная классика говнокодирования.
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, оптимизации компилятора, понятное дело, отключены.
а если шутка, то смайл ставьте:)
Надо было написать (b &!(1 << num - 1)) >> num
2) Приоритет "-" выше, чем "<<".
2) А вот это ещё одна хрень языка, я не знал про такую. Сдвиг же по функционалу схож с умножением/делением, которые более приоритетны, чем плюс/минус.