Как я устанавливаю или очищаю первые 3 бита с помощью битовых операций?

Во многих реализациях языка, написанного для описания стандарта C, попытка написать N-байтовый объект в структуре или объединении повлияла бы на значение не более N байтов в структуре или объединении. С другой стороны, на платформе, которая поддерживает 8-битные и 32-битные хранилища, но не 16-битные хранилища, если кто-то объявил тип типа:

struct S { uint32_t x; uint16_t y;} *s;

, а затем выполнил s->y = 23; без заботы о том, что случилось с двумя байтами после y, было бы быстрее выполнить 32-битное сохранение в y, слепо перезаписав два байта после него, чем выполнить пару 8-битных операций записи для обновления верхнего и нижние половины y. Авторы Стандарта не хотели запрещать такое обращение.

Было бы полезно, если бы в стандарт было включено средство, с помощью которого реализации могли бы указывать, могут ли записи в структуру или члены объединения нарушать хранилище за их пределами, а программы, которые могут быть нарушены при таком нарушении, могут отказываться работать в реализациях, где он может произойти. Однако авторы Стандарта, вероятно, ожидали, что программисты, которые будут заинтересованы в таких деталях, будут знать, на каком оборудовании должна работать их программа, и, таким образом, будут знать, будут ли такие помехи памяти проблемой для такого оборудования. [117 ]

К сожалению, современные авторы компиляторов, по-видимому, интерпретируют свободы, которые должны были помочь реализациям необычного оборудования, как открытое приглашение проявить «креативность» даже при нацеливании на платформы, которые могут эффективно обрабатывать код без таких уступок.

10
задан Community 23 May 2017 в 11:46
поделиться

6 ответов

Вы правильно установили бит: ИЛИ с маской битов, которые вы хотите установить.

Биты очистки битов очень похожи: И с одним дополнением битов, которые вы хотите очистить.

19
ответ дан 3 December 2019 в 16:54
поделиться

Предположим, у вас есть маска m с битами, установленными в 1 для всех битов, которые вы хотите установить или очистить, и 0 в противном случае:

  • сбросить биты: x & (~ m)
  • установить биты: x | m
  • flip bits: x ^ m

Если вас интересует только один бит в позиции p (начиная с 0), маску просто выразить m = 1 << p

Обратите внимание, что я используя соглашения в стиле C, где:

  • ~ является 1-дополнением: ~ 10001010 = 01110101
  • & является побитовым AND
  • | является побитовым ИЛИ
  • ^ является побитовым XOR
  • << - сдвиг левого бита: 10001010 << 2 = 00101000
4
ответ дан 3 December 2019 в 16:54
поделиться

ИЛИ с 1 всегда верно; И с 0 всегда ложно. :)

1
ответ дан 3 December 2019 в 16:54
поделиться

При условии, что ваш OR 0x14 правильный, очистка будет:

И (НЕ 0x14)

0
ответ дан 3 December 2019 в 16:54
поделиться

для очистки битов используйте AND с 0x440

0
ответ дан 3 December 2019 в 16:54
поделиться
number &= ~0xe
0
ответ дан 3 December 2019 в 16:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: