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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
#1

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

18.07.2013, 11:18. Просмотров 1093. Ответов 28
Метки нет (Все метки)

Всем привет! Помогите решить интересную задачу! Нужно ниже указный код переписать без условных операторов используя только битовые операции т.е & | ^ ~ << >>. Дополнительных переменных добавлять нельзя, так же нельзя использовать массивы.
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)];
Но это не совсем правильно, так как я использовал массивы.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.07.2013, 11:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Битовые операции (C++):

Битовые операции, битовые поля. - C++
Здравствуйте! Еслть 4 диапазона чисел: 0-100, 0-100, 0-6000, 0-3. Сделать в виде битовых операций. Записать в unsigned int. Использовать...

Битовые операции и операции смещения языка С - C++
Доброго времени суток господа,помогите пожалуйста.Есть 2 кода к задаче,первый работает верно(переводит обычные числа в 16-ти ричные),а...

Битовые операции - C++
Ребят, нужен алгоритм, а желательно и код для реализации следующей функции: Есть скажем числа от 0 до 7, т.е. 8 (2^3) Теперь...

Битовые операции - C++
Ребят, помогите кто чем может. Дана строка unsigned char. Необходимо через каждых 4 бита вставить 1, при этом ничего не затерев. ...

Битовые операции - C++
Собсно,если используется 4 байтовая переменная,то почему она представлена 16 битами(1010 0110 0010 0110),а не 32 битами?

Битовые операции - C++
Вот такая вот лаба на С, уже как не думал ну не могу решить я ее. Прошу помочь, прикрепил полное задание с примером работы(в примере...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
rlib
20 / 20 / 1
Регистрация: 01.05.2012
Сообщений: 60
18.07.2013, 11:27 #2
b = (result1 & (a==value1)) || (result2 & (a!=value1))
1
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 в случаи лжи!
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
18.07.2013, 11:35 #4
Цитата Сообщение от rlib Посмотреть сообщение
b = (result1 & (a==value1)) || (result2 & (a!=value1))
даже если б можно было использовать операторы != и ||,
считает это выражение всё равно неверно
0
dr.curse
388 / 344 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
18.07.2013, 11:36 #5
может a==value1 заменить на !(a^value1)?
0
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 минуту
Хотя да, условные операторы пользовать нельзя
0
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.
0
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 представить и сравнение!
0
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 при любых раскладах, вы что издеваетесь на домною?
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,529
Завершенные тесты: 1
18.07.2013, 12:10 #10
rlib, я что-то проглядел или откуда value2?
0
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
18.07.2013, 12:11  [ТС] #11
Да ничего Вы не проглядели просто он не правильно прочел задание!
0
Thinker
Эксперт C++
4226 / 2200 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
18.07.2013, 13:33 #12
если известна разрядность исходных чисел, то можно, но выражение будет очень длинным. А вот если можно использовать операции !, +, *, то дело куда проще.
1
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
18.07.2013, 13:36  [ТС] #13
Цитата Сообщение от Thinker Посмотреть сообщение
если известна разрядность исходных чисел, то можно, но выражение будет очень длинным. А вот если можно использовать операции !, +, *, то дело куда проще.
Могли бы написать пример кода?
0
Thinker
Эксперт C++
4226 / 2200 / 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;
1
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
18.07.2013, 13:39  [ТС] #15
Большое спасибо!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2013, 13:39
Привет! Вот еще темы с ответами:

Битовые операции - C++
Дано задание : Ввести последовательность из 8-ми символов. Если сумма единиц в представлении символа нечетная, то заменить 2 старших бита...

Битовые операции - C++
помогите написать программу в консоли... я вообще не знаю эту тему и не знаю ка делать... вот, задача.. Создайте программу,...

Битовые операции - C++
Задача. Я не понимаю что тут делать. Кто то что то понимает? Элементарное я понимаю сдвиги и прочее но это вообще:wall: Умоляю,...

Битовые операции - C++
Доброго времени суток! Есть задача: Даны два целых без знаковых числа. Остатки от деления их на 16 заносятся соответственно в 4 младших и...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.07.2013, 13:39
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru