|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Sashka Yackubtchick 2:5054/29.54 29 Nov 2001 02:51:51 To : Andrey Tarasevich Subject : максимум двух чисел без сравнения -------------------------------------------------------------------------------- 28 Nov 01 04:54, Andrey Tarasevich писАл(а) к Kostya Sudilovsky: >> ... >> >> как найти максимум двух чисел не используя условного оператора >> YZ> max(x,y) = (x+y+|x-y|)/2 >> Так ведь сказано: не используя условного оператора >> abs(x) по определению x если x>=0 иначе -x >> ... AT> По определению - да. По реализации - не обязательно. Если число 'x' AT> задано в дополнительном коде, то 'abs(x)' получается путем сброса AT> знакового бита в 'x'. Во всех известных мне машинах ЦЕЛОЧИСЛЕHЫЕ типы хранят отрицательные значения в обратном коде. Для того чтобы незнакомому с этим понятием было понятно. Любой тип в представлении на компьютере имеет количество разрядов обратный код = минимальному числу на разряд выше этого числа разрядов минус абсолютное значение отрицательного числа. Если бы регистры хранили десятичное трехразрядное число то минус 1 было бы = 1000(минимальное число из 4х разрядов) - 1 = 999 а минус 2 = 1000 - 2 = 998 В двоичном типе байт (8 разрядов) - 1 будет соответсвенно 1 0000 0000 (9 разрядов) - 1 = 1111 1111 -2 = 1 0000 0000 - 0000 0010(два) = 1111 1110 Соответсвенно если сбросить старший (знаковый) бит то вместо 1111 1111 мы получим 0111 1111 а нужно 0000 0001. Чтобы понять почему записывается так - попробуйте сложить отрицательное число с положительным или два отрицательных числа и посмотреть что будет в разрядах отведённых данному типу например -1 + 1 = 1111 1111 + 0000 0001 = 1 0000 0000 - восемь разрядов = 0 -2 + 1 = 1111 1110 + 0000 0001 = 1111 1111 - разряды = -1 -1 + 2 = 1111 1111 + 0000 0010 = 1 0000 0001 - восемь разрядов = 1 Разряды получаемые за пределами разрядов типа не пишутся (для них просто не отводится место) и отражаются обычно во флаге (в x86 - CF) для того чтобы дать возможность использовать значение этого флага как результата займа или переноса в последующих операциях (например если складываются или вычитаются числа пользовательских типов невмещаемые в регистры) Изменить знак числа с помощью лишь одного изменения знакового бита можно лишь в некоторых FPU. Пока! Sashka, The Svin. --- GoldED/W32 3.00.Beta1+ * Origin: Svin, Perm, Russia (2:5054/29.54) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/33843c0599f6.html, оценка из 5, голосов 10
|