|
|
|||||||||||
Битовые операции18.07.2013, 11:18. Показов 2157. Ответов 28
Метки нет (Все метки)
Всем привет! Помогите решить интересную задачу! Нужно ниже указный код переписать без условных операторов используя только битовые операции т.е & | ^ ~ << >>. Дополнительных переменных добавлять нельзя, так же нельзя использовать массивы.
0
|
|||||||||||
| 18.07.2013, 11:18 | |
|
Ответы с готовыми решениями:
28
Битовые операции и операции смещения языка С
|
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
|
|
| 18.07.2013, 14:42 | |
|
Можно ли использовать циклы?
![]() Я остановился на том, что нужно использовать выражение типа (~(~a & v) & r1 ) которое даст нам result1, если a и value1 равны. В противном случае оно нам даст разницу меж всеми тремя. И как-то надо прикрутить к нему вторую часть, исключающую эту разницу и, при этом, добавляющую result2, если значения условия не равны. Просто мысль. Сочинить запись я не смог.
1
|
|
|
|
||||||
| 18.07.2013, 18:10 [ТС] | ||||||
|
Нет циклов не должно быть! Вообще необходимо реализовать более быструю альтернативы условным операторам if и else if и else
Добавлено через 2 часа 36 минут Вот реализовал что говаривал Thinker!
0
|
||||||
|
|
|
| 18.07.2013, 18:20 | |
|
Что-то мне кажется, что тут излишне сложные решения:
C #include <stdio.h> /* Оригинальная функция (для проверки) */ int func1 (int a, int value1, int result1, int result2) { int b; if (a == value1) b = result1; else b = result2; return b; } /* Переписанная функция */ int func2 (int a, int value1, int result1, int result2) { int b; /* Операция !x в Си всегда будет возвращать либо 1 (если x == 0), * либо 0 (если x !=0 ). Такой операцией мы легко вычислим признак, * равны между собой две переменные, или нет */ int is_equal = ! (a - value1); /* А если на основании признака нужно вернуть первое или второе * значение, то это делается обычным взвешенным выражением, * коэффициэнты которого будут либо (1, 0), либо (0, 1) */ b = is_equal * result1 + (1 - is_equal) * result2; return b; } int main (void) { printf ("%d\n", func1 (5, 6, -1, 2)); printf ("%d\n", func1 (5, 5, -1, 2)); printf ("%d\n", func2 (5, 6, -1, 2)); printf ("%d\n", func2 (5, 5, -1, 2)); return 0; } Ой я дятел.... условие невнимательно прочитал
1
|
|
|
|
|||||||
| 18.07.2013, 18:50 | |||||||
1
|
|||||||
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
|
||||||||||||||||||
| 18.07.2013, 19:24 | ||||||||||||||||||
|
вот решил для байта если размерность числа разная то без цикла не обойтись(по моему)
Добавлено через 4 минуты поскольку ветвления нет вот так будет гораздо проще
или даже так
сдвиг вправо для знаковых и беззнаковых отличается али забыл
2
|
||||||||||||||||||
|
|
|
| 18.07.2013, 19:30 | |
|
ValeryS, сдвиг отличается в одном случае:
сдвиг вправо отрицательного числа. Только причем тут это? алгоритм работает для любых чисел (со знаком и без), все учтено ![]() у нас в c либо 0, либо 1. нам либо 0...0 надо получить, либо 1...1.
1
|
|
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
|
|||||
| 18.07.2013, 19:35 | |||||
|
вот у тебя но у меня сдвиг во второй строчке проще загоняем все биты в старший в результате получаем или 0 или -128 (0x80) потом разом сдвигаем на семь и получаем или 0 или -1(0xFF) а в остальном параллельно думаем
2
|
|||||
| 18.07.2013, 19:42 | |
|
Не по теме: понял твой трюк, молодец :good:
1
|
|
| 18.07.2013, 19:42 | |
|
Помогаю со студенческими работами здесь
29
Битовые операции Битовые операции Битовые операции Битовые операции Битовые операции Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|