· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ZEN —› a^=b^=a^=b; //обмен значений

<< . 1 . 2 . 3 . >>

Посл.отвђт Сообщен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

Кто бы мог подумать...
Вот тут ошибки нет:

unsigned z(unsigned p)
{
for(int i=0;p;i++)
p&=p-1;
return i;
}

А тут есть:

unsigned z(unsigned p)
{
{
for(int i=0;p;i++)
p&=p-1;
}
return i;
}


А я всегда искренне и самозабвенно заблуждался что в таком случае { } -- просто декорации... Ан нет.


Дата: Июн 28, 2003 22:59:17

Quantum

Зато у Chingachguk код быстрее (в большинстве случаев) и выполняется за одно и тоже кол-во тактов (большой плюс).

Не знаю как ты это проверял, но на Atlon 1600+
если обе программы скомпилировать BC 3.1, вариант с циклом работает быстрее в полтора раза при параметре равном 0ffffh, хотя с 32х битным int'ом без цикла будет быстрее.


Дата: Июн 29, 2003 03:49:18

вариант с циклом работает быстрее в полтора раза при параметре равном 0ffffh
Разве? Не может такого быть. Проверьте ещё раз. Тестил на Pentium III. Как я уже писал раньше, основное преимущество кода без цикла не скорость выполнения а постоянное количество тактов!

<< . 1 . 2 . 3 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.066