Pull to refresh

Comments 22

UFO just landed and posted this here
Верно, центр. при том 0,0 — это первый квадрант
На ассемблере лениво писать.
Но вариант решения есть.
Построить конечный автомат:
Пусть даны координаты.

Используем только логические переменные (битовые)
x1 = знак абсциссы (1 если больше нуля, 0 — если меньше)
x2 = знак ординаты (1 если больше нуля, 0 — если меньше)
f1, f2 — номер квадратнта, в виде 1 и второго разрада его двоичного предстваления -1 (1 = 00; 2 = 01; 3=10; 4=11)

x1 x2 f1 f2
1 1 0 0
0 1 0 1
0 0 1 0
1 0 1 1

Ну а дальше СНДФ:

f1 = (not(x1) and not(x2)) or (x1 and not(x2))
f2 = (not(x1) and x2) or (x1 and not(x2))

Результат А=f1*2+f2+1 (это и будет номер квадратнта).
Джампов вроде недолжно быть.
СНДФ==СДНФ== совершенно дизъюнктивная нормальная форма.
Очепятался немного.
Тут еще можно упростить (или просто догадатся по табличке)

f1 = x1 xor x2
f2 = not(x2)
Ваше решение мне нравится, ибо на мой взгляд правильное. Но я решил примерно как Хабрачелоевек под ником SSE4. (чуть ниже)
Отучился пять лет в ВУЗе и не знаю что такое «квадрант окружности». Стыдно за себя :(
UFO just landed and posted this here
У вас получилось:) Приз уходит в карму )
У кого-то, по-моему, неправильное представление о квадранте.
Подставьте точку (1; -1) в текст выше и прикиньте, сильно ли промахнулись.
Да, действительно необходимо ответы писать в последовательности

1,2,4,3

Но главное, что у человека идея правильная.
Отличная логика.
Не возмущайтесь потом, если кто-то вдруг напишет книгу, которую нужно будет читать задом наперед. Идея-то классная! :)
Но мне все время раздражало когда я читал задачу не до конца или не правильно, в итоге у меня получалась задача куда более труднее, чем на самом деле нужно было. И когда я довольный тащил решение преподавателю, то меня там ждал 0 баллов :)
UFO just landed and posted this here
__asm {
  mov ebx, y;
  and ebx, -1;
  shr ebx, 31;

  mov eax, x;
  and eax, -1;
  shr eax, 31;
  xor eax, ebx;
  shl ebx, 1;
  add eax, ebx;
  inc eax;

  mov q, eax;
}
Да, у вас действительно правильное решение. Спасибо, что решили мою задачу.
Только маленький вопросик:

mov ebx, y;
and ebx, -1;
shr ebx, 31;

Для чего нужно " and ebx, -1 "
ведь он ничего не меняет, так как вы все равно обрезаете число до знака.
Привычка, наверное — явно выделять нужные биты :)
Итак мое решение

Для начала немного теории:

Для всех числел в двоичном виде последний бит (первый слва) отвечает за знак
(бит знака)

Теперь решение:

Допустим, у нас есть два числа X и Y

Теперь запишем завиимость номера квадрантов(N) от его двоичного представления(Bn) и

от бита флагов X и Y (Bs):

N Bn Bs
1 00 00
2 01 10
3 10 11
4 11 01

Ура-есть четкая (биективная) зависимость N от Bs. Идея в том, что бы использовать

биты знака как адрес с ответом.

Реализацию программы можно делать разными способами, лично я сделал так

A = <[1,2,4,3]>

X = <ввод X>
Y = <ввод Y>

X = <сдвиг вправо до бита знака>
Y = <сдвиг вправо до бита знака>
Y = <сдвиг влево на бит>
X = <X+Y>

<Вывод элемента X из массива A>

Sign up to leave a comment.

Articles