что делает |0x01 делать на языке Си? - PullRequest
0 голосов
/ 05 апреля 2019

Сегодня я видел что-то подобное в некоторых из моих коллег:

I2C1ADB1= (slave_read_address | 0x01);

Что это | 0x01 часть делать? Это заканчивается 1 в конце битов?

Допустим, I2C1ADB1 = 0b00000000. Если я буду использовать вышеуказанную строку, будет ли новый I2C1ADB1 0b000000001? Это также увеличит число битов с 8 до 9?

Ответы [ 3 ]

2 голосов
/ 05 апреля 2019

'|'является побитовым оператором ИЛИ в C. Он выполняет побитовое ИЛИ между двумя значениями и возвращает окончательное значение.

I2C1ADB1= (slave_read_address | 0x01);

Предположим, что slave_read_address в двоичном виде равен 0bxxxxxxxx, где каждый x является битовым значением 1 или 0.Аналогично, 0x01 в двоичном виде - это 0x00000001.

Как вы знаете, ИЛИ вернет true (1), если хотя бы одно из значений будет true (1).В противном случае возвращает false (0).

. После указанной выше строки C I2C1ADB1 будет иметь 0bxxxxxxx1.

. Оператор не будет добавлять биты.Обычно '|'(ИЛИ) оператор используется для установки определенного набора битов без изменения других битов.

1 голос
/ 05 апреля 2019

Оператор I2C1ADB1 = (slave_read_address | 0x01); сохраняет значение slave_read_address в I2C1ADB1, в результате чего бит младшего разряда становится равным 1.

Ваша интерпретация неверна, значение не смещено, нет дополнительного бита добавлено .Самый младший бит установлен в 1:

  • 0 становится 1,
  • 1 без изменений,
  • 2 становится 3,
  • 3 не изменяется,
  • 4 становится 5,
  • и т. Д.
0 голосов
/ 05 апреля 2019

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

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