Разрешены ли сдвиги как побитовые операторы? Разрешены ли арифметические операторы?
Ваше редактирование не совсем ясно, но я предполагаю, что вам нужно реализовать эквивалент
a ? b : c
, где a
, b
и c
- целые числа. Это в свою очередь эквивалентно
a != 0 ? b : c
Один из способов добиться этого - найти способ превратить ненулевое значение a
в битовую комбинацию из всех единиц, используя только побитовые операторы. Если мы выясним, как это сделать, остальное будет легко. Теперь я не сразу помню какие-то хитрые трюки, которые могли бы это сделать (я думаю, они существуют), и я точно не знаю, какие операторы разрешены, а какие нет, поэтому сейчас я просто буду использовать что-то вроде
a |= a >> 1; a |= a >> 2; a |= a >> 4; a |= a >> 8; a |= a >> 16;
a |= a << 1; a |= a << 2; a |= a << 4; a |= a << 8; a |= a << 16;
Для 32-разрядного целочисленного типа, если (и только если) был установлен хотя бы один бит в исходном a
, приведенное выше должно привести ко всем битам a
, установленным в 1. (Предположим, что мы работаем с целыми числами без знака, чтобы избежать проблем, связанных со смещением значений со знаком). Опять же, должен быть более умный способ сделать это, я уверен. Например: a = !a - 1
, но я не знаю, разрешены ли !
и -
.
Как только мы это сделаем, исходный условный оператор станет эквивалентным
(a & b) | (~a & c)
Готово.