Аватар для DKOI
24 / 24 / 0
Регистрация: 08.09.2010
Сообщений: 136

Задачка на пошевелить чуть-чуть мозгами (Нужно получить ноль, если в регистре ноль, и единицу в обратном случае)

11.12.2011, 00:38. Показов 3592. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В процессе написания кода столкнулся с одной задачей, которая показалась мне интересной и я хотел бы поделиться ей с вами и послушать альтернативные варианты реализации, коль таковые имеются.
В регистре есть число. Нужно получить ноль, если в регистре ноль, и единицу в обратном случае. Казалось бы, тривиально, таковым и является. Однако усложним задачу, запретив использовать условные и безусловные переходы. То есть, алгоритм, реализующий это без ветвлений. Мой вариант под катом, но советую в начале самим пошевелить мозгами Свои варианты пожалуйста также постите под кат.
ответ
Код AT&T x64.
Пусть исходное число лежит в %rax
Assembler
1
2
3
4
5
6
add %rax, %rax; складываем %rax с самим собой
pushf; кладем в стек регистр флагов
pop %rax; и достаем его в %rax
shr $6, %rax; переносим ZF в нулевой бит регистра
not %rax; инвертируем его значение
andq $1, %rax; и зануляем лишние биты
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.12.2011, 00:38
Ответы с готовыми решениями:

файл вещественных чисел, нужно поравить код совсем чуть-чуть
Вот написал, но работает только для целых чисел.Как сделать для файла с вещественными числами? #include <stdio.h> #include...

Немогу разобраться в программе нужно пожалуйста чуть чуть дописать её!
Уже вроде все написал.И должно работать!! Но не хочет рисовать незнаю почему, если кто нибудь исправит и все выше описанное заработает буду...

Если в матрице встречается ноль, то нужно обнулить столбец и строку, где находится этот ноль
Дан двумерный массив n на m. Если в массиве встречается ноль, то нужно обнулить столбец и строку ,где находится этот ноль.

27
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
28.06.2013, 08:23
Студворк — интернет-сервис помощи студентам
В принципе вот рабочий вариант, но при eax=0 выдаст исключение.
Assembler
1
2
cdq
idiv eax
Добавлено через 1 минуту
Thread
Опередил

Добавлено через 14 минут
Assembler
1
2
3
xor     ecx,ecx
cmpxchg ecx,ecx
setnz   al
Добавлено через 23 минуты
Assembler
1
2
3
4
popcnt eax,eax
popcnt eax,eax
popcnt eax,eax
popcnt eax,eax
Добавлено через 3 минуты
Assembler
1
2
popcnt eax,eax
setnz  al
0
3129 / 1719 / 273
Регистрация: 19.02.2010
Сообщений: 4,511
30.06.2013, 21:35
Цитата Сообщение от murderer Посмотреть сообщение
У меня меньше 3 строк не выходит
mov edx,1
test eax,eax
cmovne eax,edx
у cmov... второй аргумент может быть адресом данных в памяти. Т.е. сначала (да, "третьей строкой") заводим переменную с единичным значением, а потом её юзаем. Но проц при этом будет исполнять всего 2 команды.
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
30.06.2013, 22:55
Хм. А так?
Assembler
1
2
    bsr ecx, eax
    shr eax, cl
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16376 / 7688 / 1080
Регистрация: 11.11.2010
Сообщений: 13,768
01.07.2013, 04:53
Цитата Сообщение от Charles Kludge Посмотреть сообщение
bsr ecx, eax
shr eax, cl
это решение приводил murderer, здесь, но если верить Агнеру Фогу
BSF и BSR - хуже всего оптимизированные инструкции на PPlain и PMMX, которые занимают приблизительно 11+2*n тактов, где n равен количеству пропущенных нулей.
поэтому по скорости выиграет это
Assembler
1
2
3
4
5
6
7
8
9
10
    mov eax,789
    push 0
    push eax
    fild qword ptr [esp]
    fstp qword ptr [esp]
    pop ecx
    pop ecx
    shr ecx,20; изолируем экспоненту
    sub ecx,3FFh; переводим из смещенного кода
    shr eax,cl
0
01.07.2013, 09:36

Не по теме:

Цитата Сообщение от Mikl___ Посмотреть сообщение
это решение приводил murderer
А я не подглядывал, а когда нашёл, что я не первый, удалять мессагу было поздно. Надеюсь, меня не обвинят в плагиате.

0
01.07.2013, 10:02

Не по теме:

Цитата Сообщение от Charles Kludge Посмотреть сообщение
Надеюсь, меня не обвинят в плагиате.
:rofl:

0
01.07.2013, 10:09

Не по теме:

Цитата Сообщение от Charles Kludge Посмотреть сообщение
Надеюсь, меня не обвинят в плагиате.
Если в чём и можно обвинить всех, написавших в этом году в теме, так это в некрофилиипостинге.

0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
01.07.2013, 10:56
NEG EAX
SBB EAX,EAX
NEG EAX
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.07.2013, 10:56

Какие именно темы в математике нужно выучить, чтобы начать хоть чуть-чуть понимать математический анализ и всё остальное
Здравствуйте, не знаю в правильном ли я месте спрашиваю, но любой совет поможет. Я студент 1 курса, сегодня перевёлся на направление...

Когда я соединяю комп и телевизор через Tv-Out, кабель чуть чуть искрит.
Всем привет. Есть такой вопрос. Когда я соединяю комп и телевизор через Tv-Out, кабель чуть чуть искрит. Если я беру другой кабель, не...

Некорректно работает ListListener и еще чуть-чуть всякого стаффа
Всем привет! Я постигаю вощем java потихоньку... вот у меня возникло пара вопросов: 1)почему у меня два раза в JList записываются...

Много текста на одной странице или по чуть-чуть на нескольких?
В процессе оформления перечня и описания услуг на сайте компании я озадачился следующей вещью. Как лучше разместить информацию на сайте,...

Отнять последнюю строку от остальных (чуть-чуть исправить код)
Надо последнею строку матрицы отнять от всех остальных, у меня это получилось сделать, но в условии сказано что последняя строка должна...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Опции темы

Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru