1 | |||||||||||
Битовые операции18.07.2013, 11:18. Показов 1742. Ответов 28
Метки нет (Все метки)
Всем привет! Помогите решить интересную задачу! Нужно ниже указный код переписать без условных операторов используя только битовые операции т.е & | ^ ~ << >>. Дополнительных переменных добавлять нельзя, так же нельзя использовать массивы.
0
|
18.07.2013, 11:18 | |
Ответы с готовыми решениями:
28
Битовые операции, битовые поля. Битовые операции и операции смещения языка С битовые операции Битовые операции |
20 / 20 / 2
Регистрация: 01.05.2012
Сообщений: 61
|
|
18.07.2013, 11:27 | 2 |
b = (result1 & (a==value1)) || (result2 & (a!=value1))
1
|
18.07.2013, 11:35 [ТС] | 3 |
Спасибо за вариант но по условию можно использовать только оператор присваивания = и битовые операции & | ^ ~ << >> и все!
Добавлено через 2 минуты Вчитайтесь в условие задачи, вы его этим выражением не выполнили! Добавлено через 2 минуты Ваше выражение возвращает 0 в случаи истины и 1 в случаи лжи! А должно присвоит b заданное значение value1 в случаи истины и value2 в случаи лжи!
0
|
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
|
|
18.07.2013, 11:36 | 5 |
может a==value1 заменить на !(a^value1)?
0
|
20 / 20 / 2
Регистрация: 01.05.2012
Сообщений: 61
|
|
18.07.2013, 11:38 | 6 |
x = (a==value1)&(0xffff)) || (a==value1)&(0xefff);
y = (a==value2)&(0xffff)) || (a==value2)&(0xefff); b = ( result1 & x) || (result2 & y); Добавлено через 1 минуту Хотя да, условные операторы пользовать нельзя
0
|
18.07.2013, 11:43 [ТС] | 7 |
Уважаемый Rlib вчитайтесь в задание дело даже не в том что вы используете не те операторы. Дело в том что само условие задачи не выполняется. Я повторюсь с условием. Если a == value1 то присвоить b значение result1 иначе result2! То есть на выходе в b должно быть число задаваемое или result1 или result2 в зависимости от выполненного условия a ?= value1.
0
|
20 / 20 / 2
Регистрация: 01.05.2012
Сообщений: 61
|
|
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
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
18.07.2013, 12:10 | 10 |
rlib, я что-то проглядел или откуда value2?
0
|
18.07.2013, 14:08 | 18 | |||||
лучше поясню в чем будет смыл. Для простоты переобозначу переменные так:
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 можно вставлять выражения (то есть не будет лишних переменных), но выражение будет ОГРОМНЫМ.
2
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
18.07.2013, 14:13 | 20 |
Я тут все пытался тоже самое замутить, но через ~(~a & b)
По сути нам надо всего лишь построить на доступной логике общий алгоритм, превращающий любое число в ноль (или единицу).
1
|
18.07.2013, 14:13 | |
18.07.2013, 14:13 | |
Помогаю со студенческими работами здесь
20
Битовые операции Битовые операции Битовые операции Битовые операции Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |