Установка всех битов на наименее значимый бит - PullRequest
0 голосов
/ 30 января 2019

Если у меня есть x типа int, как я могу получить значение x LSB и установить все остальные биты в этом числе в этот LSB?

IНемного возился с побитовыми и логическими операторами (без каламбура), и я понимаю, как они функционируют.

Операторы сдвига x >> 3 и x << 3 сдвигают биты х на три пробела влевои справа соответственно, и я знаю, что мы можем использовать операторы, такие как ^ | и &, чтобы возиться с манипулированием битами.У меня проблемы с пониманием логики этой конкретной проблемы.

РЕДАКТИРОВАТЬ: операторы, которые нам разрешено использовать для этого, являются!~ & ^ |+ << >>

Ответы [ 3 ]

0 голосов
/ 30 января 2019

if (x & 1) {x = 4294967295} else {x = 0}.Другими словами, если x нечетно, LSB равен 1, поэтому установите x в максимально возможное 32-разрядное целое число без знака (все биты установлены в 1), в противном случае, если x является четным, младший бит равен нулю, поэтому установите x равным нулю.Но подождите, это целое число со знаком, установка всех битов в 1 будет означать, что бит со знаком установлен.Так что измените это так: if (x & 1) {x = -1} else {x = 0}.Как прокомментировал Евгений, можно просто использовать - (x & 1).

0 голосов
/ 30 января 2019

Вы все предполагаете - но недавно я помогал экзаменовать студентов и задавать вопрос - найти младший бит или значение младшего бита означает самый низкий бит, установленный в числе.Это имеет больше смысла, делая задачу менее тривиальной и очевидной.

в этом случае:

, чтобы получить значение LSB - z & (~z+1)

 z = ~(z & (~z+1));
0 голосов
/ 30 января 2019

Очень буквально:

type x /*=some value*/;
_Bool lsb = x&1;
x = lsb ? ~(type)0 : (type)0;

Оптимизация компиляторов на 2-х архитектурах дополнения делает его менее разветвленным и эквивалентным:

 type x /*=some value*/;
_Bool lsb = x&1;
 x = -lsb;

(или -(x&1) без посредника lsbпеременная.)

https://gcc.godbolt.org/z/2NXFpS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...