Форум программистов, компьютерный форум CyberForum.ru

Битовые операции - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
18.07.2013, 11:18     Битовые операции #1
Всем привет! Помогите решить интересную задачу! Нужно ниже указный код переписать без условных операторов используя только битовые операции т.е & | ^ ~ << >>. Дополнительных переменных добавлять нельзя, так же нельзя использовать массивы.
C
1
2
3
4
5
6
7
8
9
/* значения a,value1,result1,result2 задаются пользователем */
if ( a == value1)
{
  b = result1;
}
else
{
 b = result2;
}
Подскажите пожалуйста, как это организовать!? Я только додумался вот до этого:
C
1
2
register m[]={result1,result2};
b = m[!!(a ^ value1)];
Но это не совсем правильно, так как я использовал массивы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.07.2013, 11:18     Битовые операции
Посмотрите здесь:

Битовые операции C++
C++ Битовые операции
C++ Битовые операции
C++ Битовые операции
Битовые операции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rlib
20 / 20 / 1
Регистрация: 01.05.2012
Сообщений: 60
18.07.2013, 11:27     Битовые операции #2
b = (result1 & (a==value1)) || (result2 & (a!=value1))
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
18.07.2013, 11:35  [ТС]     Битовые операции #3
Спасибо за вариант но по условию можно использовать только оператор присваивания = и битовые операции & | ^ ~ << >> и все!

Добавлено через 2 минуты
Цитата Сообщение от rlib Посмотреть сообщение
b = (result1 & (a==value1)) || (result2 & (a!=value1))
Вчитайтесь в условие задачи, вы его этим выражением не выполнили!

Добавлено через 2 минуты
Ваше выражение возвращает 0 в случаи истины и 1 в случаи лжи! А должно присвоит b заданное значение value1 в случаи истины и value2 в случаи лжи!
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
18.07.2013, 11:35     Битовые операции #4
Цитата Сообщение от rlib Посмотреть сообщение
b = (result1 & (a==value1)) || (result2 & (a!=value1))
даже если б можно было использовать операторы != и ||,
считает это выражение всё равно неверно
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
18.07.2013, 11:36     Битовые операции #5
может a==value1 заменить на !(a^value1)?
rlib
20 / 20 / 1
Регистрация: 01.05.2012
Сообщений: 60
18.07.2013, 11:38     Битовые операции #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
даже если б можно было использовать операторы != и ||,
считает это выражение всё равно неверно
x = (a==value1)&(0xffff)) || (a==value1)&(0xefff);
y = (a==value2)&(0xffff)) || (a==value2)&(0xefff);

b = ( result1 & x) || (result2 & y);

Добавлено через 1 минуту
Хотя да, условные операторы пользовать нельзя
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
18.07.2013, 11:43  [ТС]     Битовые операции #7
Цитата Сообщение от rlib Посмотреть сообщение
x = (a==value1)&(0xffff)) || (a==value1)&(0xefff);
y = (a==value2)&(0xffff)) || (a==value2)&(0xefff);

b = ( result1 & x) || (result2 & y);

Добавлено через 1 минуту
Хотя да, условные операторы использовать нельзя
Уважаемый Rlib вчитайтесь в задание дело даже не в том что вы используете не те операторы. Дело в том что само условие задачи не выполняется. Я повторюсь с условием. Если a == value1 то присвоить b значение result1 иначе result2! То есть на выходе в b должно быть число задаваемое или result1 или result2 в зависимости от выполненного условия a ?= value1.
rlib
20 / 20 / 1
Регистрация: 01.05.2012
Сообщений: 60
18.07.2013, 11:54     Битовые операции #8
x = !(a==value1) || (a==value1);
y = !(a==value2) || (a==value2);

b = ( result1 & x) || (result2 & y);

Но так-то выполняется!

Остается только ОR через AND и NOT представить и сравнение!
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
18.07.2013, 12:05  [ТС]     Битовые операции #9
Цитата Сообщение от rlib Посмотреть сообщение
x = !(a==value1) || (a==value1);
y = !(a==value2) || (a==value2);

b = ( result1 & x) || (result2 & y);

Но так-то выполняется!

Остается только ОR через AND и NOT представить и сравнение!
Операция || возвращает 0 или 1 при любых раскладах, вы что издеваетесь на домною?
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
18.07.2013, 12:10     Битовые операции #10
rlib, я что-то проглядел или откуда value2?
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
18.07.2013, 12:11  [ТС]     Битовые операции #11
Да ничего Вы не проглядели просто он не правильно прочел задание!
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
18.07.2013, 13:33     Битовые операции #12
если известна разрядность исходных чисел, то можно, но выражение будет очень длинным. А вот если можно использовать операции !, +, *, то дело куда проще.
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
18.07.2013, 13:36  [ТС]     Битовые операции #13
Цитата Сообщение от Thinker Посмотреть сообщение
если известна разрядность исходных чисел, то можно, но выражение будет очень длинным. А вот если можно использовать операции !, +, *, то дело куда проще.
Могли бы написать пример кода?
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
18.07.2013, 13:37     Битовые операции #14
можно без сложения:
C++
1
2
   int x = 10, y = 20, a = 2, b = 2, rezult;
   rezult = !(a ^ b) * x | !!(a ^ b) * y;
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
18.07.2013, 13:39  [ТС]     Битовые операции #15
Большое спасибо!
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
18.07.2013, 13:40     Битовые операции #16
было бы за что дополнительно пришлось * и ! использовать, без этого выражение просто огромным получится.
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
18.07.2013, 13:43  [ТС]     Битовые операции #17
Если есть время, могли бы показать это "огромное выражение" мне для лучшего понимания битовой логики!
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
18.07.2013, 14:08     Битовые операции #18
лучше поясню в чем будет смыл. Для простоты переобозначу переменные так:
C++
1
rezult = (a == b) ? x : y;
так вот, предположим, что мы знаем разрядность всех переменных и она равна n.

a==b тогда и только тогда, когда ~(a^b) == 1...1 (все n единичек)

1. шаг.
Обозначим (временно) A = ~(a^b). Выделим в A все биты:
A & 1, (A >> 1) & 1,..., (A >> (n-1)) & 1
и ко всем выделенным битам применим операцию &:
AA = (A & 1) & ... & ((A >> (n-1)) & 1)

так вот если a==b, то AA == 1, иначе AA == 0.

Далее младший бит в AA ставим на все остальные позиции:
AAA = (AA & 1) | ((AA & 1) << 1) | ... | ((AA & 1) << (n-1))
получим число 1...1 (число из всех единиц), если a==b, либо 0...0 (если a не равно b).
к полученному числу и x применяем &.

Половина выражения закончена, результатом которого будет либо x, либо 0.

2. шаг. Пусть B = (a^b)
ко всем выделенным битам числа B применим операцию |:
BB = (B & 1) | ... | ((B >> (n-1)) & 1)
при этом если a==b, то BB == 0, иначе BB == 1.

Далее младший бит в BB ставим на все остальные позиции:
BBB = (BB & 1) | ((BB & 1) << 1) | ... | ((BB & 1) << (n-1))
получим число 1...1 (число из всех единиц), если a!=b, либо 0...0 (если a==b).
к полученному числу и y применяем &.

А далее,
rezult = AAA & x | BBB & y;

вместо A, AA, AAA, BB, BBB можно вставлять выражения (то есть не будет лишних переменных), но выражение будет ОГРОМНЫМ.
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
18.07.2013, 14:09  [ТС]     Битовые операции #19
Большое спасибо!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2013, 14:13     Битовые операции
Еще ссылки по теме:

C++ Битовые операции
C++ Битовые операции

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

Или воспользуйтесь поиском по форуму:
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
18.07.2013, 14:13     Битовые операции #20
Цитата Сообщение от Thinker Посмотреть сообщение
~(a^b)
Я тут все пытался тоже самое замутить, но через ~(~a & b)

По сути нам надо всего лишь построить на доступной логике общий алгоритм, превращающий любое число в ноль (или единицу).
Yandex
Объявления
18.07.2013, 14:13     Битовые операции
Ответ Создать тему
Опции темы

Текущее время: 11:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru