|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Andrew Ezhguroff 2:5020/400 28 Nov 2001 14:08:02 To : Kostya Sudilovsky Subject : Re: максимум двух чисел без сравнения -------------------------------------------------------------------------------- Привет! "Kostya Sudilovsky" <Kostya.Sudilovsky@p4.f64.n452.z2.fidonet.org> сообщил(а) нам: > Так ведь сказано: не используя условного оператора > abs(x) по определению x если x>=0 иначе -x Получение abs без сравнений: производим xor между всеми разрядами числа и его знаковым разрядом и прибавляем знаковый разряд к полученному результату. Для слова (два байта) на C/C++: int Tmp = Val&0x8000; // В Tmp - знаковый разряд; Tmp|=Tmp>>1; // Заносим знаковый разряд Tmp|=Tmp>>2; // во все биты Tmp Tmp|=Tmp>>4; // Это эквивалентно: Tmp|=Tmp>>8; // if Val<0 then Tmp:=-1 else Tmp:=0; Val^=Tmp; // Val:=Val xor Tmp; // Это эквивалентно if Val<0 then Val:=not Val; Val+=Tmp&1; // Val:=Val+(Tmp and 1); // Это эквивалентно if Tmp<0 then Val:=Val+1; В целом получилось: if Val<0 then Val:=(not Val)+1; Что и требовалось. С уважением, Андрей. --- ifmail v.2.15dev5 * Origin: COMSTAR Telecommunications (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/121685a607a35.html, оценка из 5, голосов 10
|