Битовая манипуляция для свойства идентичности - PullRequest
0 голосов
/ 22 сентября 2019

Учитывая целое число и либо 1, либо 0, я бы хотел получить либо целое число, либо 0, используя только побитовые операторы.Это означает, что нет, если операторы, условия и т. Д. В основном целое число * я.Система двойного дополнения!

Я работаю некоторое время, и это сложно.Вот мои неудачные попытки: Редактировать: целые числа без знака

unsigned int x = 24; // To change
unsigned int i = 0; // identity

((~i) | x) // if i  = 0, ~i returns 111...1    || (111...1 | x) = 111...1
          //  else ~i returns 000...1          || (000...1 | x) = x (+1 sometimes)

Приведенный выше код делает это так, что если я равен 1, то я получаю идентификатор (только иногда), а если я равен 0, тоЯ получаю -1.Мне бы хотелось, чтобы, если мне было 1, я получал удостоверение, а если мне 0, я получал 0. Спасибо!

Ответы [ 2 ]

2 голосов
/ 22 сентября 2019

Это можно сделать с помощью

~i + 1u & x

~0u производит UINT_MAX (все биты 1):

1111...1111

Добавление 1 возвращает к 0:

0000...0000

С другой стороны, ~1u производит UINT_MAX - 1:

1111...1110

При добавлении 1 затем получается UINT_MAX (все биты 1):

1111...1111

Этиидеальные битовые маски для использования с &: (0 & x) == 0 и (UINT_MAX & x) == x.

2 голосов
/ 22 сентября 2019

Я думаю, это то, что вы хотите:

i & -x

Если x равно нулю, вы получите i & 0, что равно нулю.Если x равен единице, вы получите i & UINT_MAX, что составляет i.

...