Помогите начать в назначении конкретных бит - PullRequest
2 голосов
/ 03 сентября 2011

Итак, у меня есть проблема для моего класса, из-за которой у меня проблемы с началом работы. Я не прошу людей решать эту проблему за меня, я просто хотел бы, чтобы все двигалось в правильном направлении. Мне нужно создать функцию в C, которая при получении любого 32-битного целого числа возвращает целое число, где каждый 4-й бит установлен в 1, начиная с младшего бита. Я понимаю, как это должно выглядеть в конце, но, начав, я заблудился. Нам не разрешено использовать любые для циклов или условных выражений, только стандартные побитовые и логические операторы (! ~ & ^ | + << >>). Еще раз, я не прошу никого делать это для меня, мне просто нужна помощь, чтобы заставить меня думать в правильном направлении. Я видел некоторые другие посты здесь и на других страницах, но, похоже, никто не нажимал. Я понимаю, что вы можете сдвинуть бит 1 в определенное место x << 3, но выходя за рамки этого, я застрял Любая помощь будет оценена. </p>

Ответы [ 3 ]

2 голосов
/ 03 сентября 2011
int get_int_with_every_fourth_bit_set()
{
    return 0x88888888;
}

Хорошо, это было в основном шутливо.Вот список того, что делают побитовые операторы:

  • поразрядно NOT (~): переключение битов, от 0 до 1 и от 1 до 0
  • AND (&): Установить бит, если бит в этой позиции установлен в обоих операндах
  • ИЛИ (|): установить бит, если бит в этой позиции установлен в любом операнде
  • XOR (^): установите бит, если между двумя операндами установлен ровно один бит в этой позиции.
  • Битовый сдвиг (<< и >>): перемещение каждого бита на указанное значение в заданном направлении.,При смещении влево нули добавляются к младшему значащему биту.При смещении вправо добавляется ноль, если значение является беззнаковым или положительным.

Вот некоторые побитовые уловки, которые полезно знать:

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

Все полномочия двух имеют ровно один 1 бит.Чтобы увидеть, является ли число степенью двойки, вы можете сделать это:

return !(x & (x - 1)) && x

В качестве примера, скажем, x = 16, что является степенью двойки.Затем x - 1 = 15, поэтому значения, которые должны быть ANDed, равны 00010000 и 00001111.Поскольку каждая битовая позиция имеет ноль по крайней мере в одном из двух операндов, результат равен нулю.!0 верно, поэтому проверьте, если x != 0.Начиная с 16 != 0, оператор возвращает true.Если вы попробуете это с числом, которое не является степенью двойки и не равно нулю, то проверка x & (x - 1) всегда будет верна.Так круто!

Еще один совет: начиная с 0 ^ 0 = 0 и 1 ^ 1 = 0, вы можете использовать XOR, чтобы увидеть, какие биты изменились.Например, если у вас есть два байта и вы хотите увидеть биты, которые изменились между ними, XOR двух байтов даст вам 1 в позиции всех битов, которые изменились.

1 голос
/ 03 сентября 2011

Можете ли вы записать (в шестнадцатеричном виде) 32-разрядное целое число, в котором каждый 4-й бит установлен в 1, а все остальные биты установлены в 0?

Теперь, есть ли операция, которую вы можете применить к своему входу и этому магическому числу, которое устанавливает каждый 4-й бит ввода на 1, но оставляет остальные биты в покое?

0 голосов
/ 03 сентября 2011

Check bitmasking .

... Поэтому, чтобы убедиться, что бит включен, ИЛИ можно использовать с 1. Чтобы оставить битбез изменений, ИЛИ используется с 0.

Таким образом, маска для вашего случая (оставляя другие биты без изменений) будет:

Двоичный: 10001000100010001000100010001000 Шестнадцатеричный: 88888888

...