Каким должен быть язык программирования? Анализ и критика Описание языка Компилятор
Отечественные разработки Cтатьи на компьютерные темы Компьютерный юмор Новости и прочее

Найти минимум из двух положительных целых чисел без операций сравнения

Одна очень уважаемая компания просит желающих в ней работать решить перед собеседованием ряд задач. Вот одна из них.

            Дополнительный код это используемый в современных компьютерах способ кодирования целых чисел, при котором неотрицательное число X представляется «как есть» а отрицательное число X как ~(|X|-1). Таким образом, максимальное неотрицательное число, которое может быть представлено 32-мя разрядами дополнительного кода, есть 231-1. Для любого неотрицательного числа в дополнительном коде старший разряд равен нулю, а для любого отрицательного — единице.

            Найдите метод поиска минимума из двух положительных 32-разрядных целых чисел представленных в дополнительном коде не использующий операций сравнения и условных переходов.

            Естественно интересен метод, использующий минимальное число операций и не использующий никаких вспомогательных таблиц. Вы можете пользоваться следующими 32-разрядными операциями:

Мнемоника Эквивалентная
операция языка Си
Комментарий
add(x, y) x + y сложение в дополнительном коде
sub(x, y) x - y вычитание в дополнительном коде
mul(x, y) x * y умножение в дополнительном коде
sdiv(x, y) ((signed)x) / ((signed)y) знаковое деление в дополнительном коде
udiv(x, y) ((unsigned)x) / ((unsigned)y) беззнаковое деление в дополнительном коде
or(x, y),
xor(x, y),
and(x, y)
x | y
x ^ y
x & y
логические операции
orn(x, y),
xorn(x, y),
andn(x, y)
x | ~y
x ^ ~y
x & ~y
логические операции с инверсией второго аргумента
shl(x, y) x << y сдвиг влево
shra(x, y) ((signed)x) >> y арифметический сдвиг вправо (с распространением знакового разряда)
shrl(x, y) ((unsigned)x) >> y логический сдвиг вправо (с распространением нуля)

            Известен способ нахождения минимума при помощи 4 операций, но конечно Вы можете дать ответ и в том случае если получили большее число операций.

            Интересная задача. Ниже в рамке приведено её решение 5 операциями на Си (4 операциями не осилил). Поскольку не интересно решать задачу, видя перед собой готовое решение, то это решение спрятано. Т.е. текст записан цветом фона. Если хотите текст увидеть, выделите его мышкой.
#include <iostream.h>
#define	p(arg)	{cout << __FILE__ << ": " << __LINE__ << \
". " << #arg << " = <" << (arg) << ">" << "\n";};
unsigned  int  min (unsigned  int  x, unsigned  int  y)
{	signed  int  a = x - y;   // 1-я операция
	a >>= 31;                 // 2-я операция
	return  x & a | y &~ a;   // операции 3,4,5
};
main()
{	p(min(1, 2));
	p(min(2, 0));
	p(min(42, 659990));
	p(min(9999942, 659990));
	return  0;
};

Опубликовано: 2012.09.25, последняя правка: 2018.10.29    15:55

ОценитеОценки посетителей
   ███████████████████ 8 (44.4%)
   ███ 1 (5.55%)
   ███ 1 (5.55%)
   ███████████████████ 8 (44.4%)

Отзывы

     2014/06/03 07:36, Алексей          # 

Не совсем то, но вот ещё решение:
int min (int a, int b) {
  return (a + b - ABS (a - b))/2;
}

     2014/06/04 16:48, Автор сайта          # 

Операции ABS нет в перечне «позволенного». Но её можно заменить на AND:

(a + b - (a - b) & 0x7FFFFFFF) / 2
Итого 5 операций: «-», «&», «+», «-», «/».

     2016/03/28 20:02, rst256          # 

Только зря он в этом решении декларирует аргументы у функции min как беззнаковые. Правильнее было бы как со знаком, ведь работать этот код верно будет только как раз для чисел со знаком. А потом ещё говорят, что си небезопасный язык.

Добавить свой отзыв

Написать автору можно на электронную почту
mail(аt)compiler.su

Авторизация

Регистрация

Выслать пароль

Карта сайта


Содержание

Каким должен быть язык программирования?

Анализ и критика

Описание языка

Компилятор

Отечественные разработки

Cтатьи на компьютерные темы

Компьютерный юмор

Новости и прочее

●  Политика размещения комментариев и статей

●  Предложения и замечания

●  Все голосования

●  Компьютерные ребусы и этюды для программистов

●●  Найти минимум из двух положительных целых чисел без операций сравнения

●  Утилита транслитерации русского C/C++ в стандартный

●  Решение системы уравнений методом Гаусса. Программа на русском C++

●  Вычисление определителя матрицы. Программа на русском Си




Последние отзывы

2024/04/18 11:14 ••• Ivan
Энтузиасты-разработчики компиляторов и их проекты

2024/04/18 04:47 ••• void
Признаки устаревшего языка

2024/04/11 00:08 ••• Автор сайта
Постфиксные инкремент и декремент

2024/04/09 23:50 ••• Автор сайта
Русский язык и программирование

2024/04/07 15:33 ••• MihalNik
Все языки эквивалентны. Но некоторые из них эквивалентнее других

2024/04/01 23:39 ••• Бурановский дедушка
Новости и прочее

2024/04/01 23:32 ••• Бурановский дедушка
Русской операционной системой должна стать ReactOS

2024/03/22 20:41 ••• void
Раскрутка компилятора

2024/03/20 19:54 ••• kt
О многократном резервировании функций

2024/03/20 13:13 ••• Неслучайный читатель
Надёжные программы из ненадёжных компонентов

2024/03/07 14:16 ••• Неслучайный читатель
«Двухмерный» синтаксис Python

2024/03/03 16:49 ••• Автор сайта
О неправомерном доступе к памяти через указатели

2024/02/28 18:59 ••• Вежливый Лис
Про лебедей, раков и щук