|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июн 27, 2003 10:13:06 > А как сделать четырьмя без переходов? Кажется, вот так: @@DecCount: sub cx,1 sbb ax,ax imul byte ptr @Max sub cx,ax ret @Max: db N |
|
|
Дата: Июн 27, 2003 10:24:09 Кстати, я тут сейчас пишу на си (на работе), который мне не нравится ;) Иногда мне приходится собеседовать людей и нужно их как-то проверить. Так вот, я им показываю следующий код: typedef unsigned int BYTE; #define BitsSize 16 // ... int F(BYTE b) { BYTE wb; wb=b; wb&=(1<<BitsSize)-1; wb=(wb&0x5555)+((wb&0xAAAA)>>1); wb=(wb&0x3333)+((wb&0xCCCC)>>2); wb=(wb&0x0F0F)+((wb&0xF0F0)>>4); wb=(wb&0xFF)+(wb>>8); return(wb); } И задаю два вопроса: 1. Что делает этот код ? 2. Как он это делает ? Еще никто не смог ответить ;) |
|
|
Дата: Июн 27, 2003 12:19:52 |
|
|
Дата: Июн 27, 2003 12:45:08 Chingachguk прикольно:) насколько я понимаю - эта штучка считает количество бит в байте... правильно? |
|
|
Дата: Июн 27, 2003 12:46:02 исправляюсь: количество единичных бит. |
|
|
Дата: Июн 27, 2003 17:06:13 Только не в байте, а в слове. |
|
|
Дата: Июн 28, 2003 00:24:03 > прикольно:) насколько я понимаю - эта штучка > считает количество бит в байте... правильно? Конечно ;) Да, все-таки wasm.ru это вам ... продвинутые люди ! |
|
|
Дата: Июн 28, 2003 16:21:14 Chingachguk Я нашел еще один варианит: sub ecx,1 sbb eax,eax and eax,N add ecx,eax И как я сразу не додумался что N не нужно в регистр засылать?! All А что делает этот код? unsigned z(unsigned p) { for(int i=0;p;i++) p&=p-1; return i; } |
|
|
Дата: Июн 28, 2003 16:54:13 Да ничего он не делает - он с ошибкой, ведь у i область видимости - только цикл for. При попытке использовать i за пределами цикла компилятор по идее должен начать нервничать. Вот если код модифицировать вот таким образом: unsigned z(unsigned p) { int i=0 for(;p;i++) p&=p-1; return i; } То возвращаемое значение - количество единиц в слове ( как у Chingachguk, но намного короче :) |
|
|
Дата: Июн 28, 2003 19:08:39 Зато у Chingachguk код быстрее (в большинстве случаев) и выполняется за одно и тоже кол-во тактов (большой плюс). |
|
|
Дата: Июн 28, 2003 20:04:50 > Да ничего он не делает - он с ошибкой, ведь у i область видимости - только цикл for. Разве? А по окончанию цикла она уничтожается? По моему функция молча вернет количество итераций. А вот что означает это количество? |
|
|
Дата: Июн 28, 2003 20:16:15 Хотя действительно... Ругается. Но в данном случае (в одном блоке с циклом) i еще видима. |
|
|
Дата: Июн 28, 2003 20:36:52 Кто бы мог подумать... Вот тут ошибки нет:
А тут есть:
А я всегда искренне и самозабвенно заблуждался что в таком случае { } -- просто декорации... Ан нет. |
|
|
Дата: Июн 28, 2003 22:59:17 Quantum Зато у Chingachguk код быстрее (в большинстве случаев) и выполняется за одно и тоже кол-во тактов (большой плюс). Не знаю как ты это проверял, но на Atlon 1600+ если обе программы скомпилировать BC 3.1, вариант с циклом работает быстрее в полтора раза при параметре равном 0ffffh, хотя с 32х битным int'ом без цикла будет быстрее. |
|
|
Дата: Июн 29, 2003 03:49:18 вариант с циклом работает быстрее в полтора раза при параметре равном 0ffffh Разве? Не может такого быть. Проверьте ещё раз. Тестил на Pentium III. Как я уже писал раньше, основное преимущество кода без цикла не скорость выполнения а постоянное количество тактов! |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.066 |