Что значит ~ (uint32_t)? - PullRequest
       27

Что значит ~ (uint32_t)?

2 голосов
/ 17 марта 2010

Я читаю немного кода на C в ядре ОС, которое говорит

x & ~(uint32_t)CST_IEc;

Что означает ~()? За тильдой следуют скобки!

Ответы [ 7 ]

19 голосов
/ 17 марта 2010

~() на самом деле две вещи:

  1. (uint32_t) является актером.
  2. ~ - оператор побитового дополнения.
10 голосов
/ 17 марта 2010

Еще несколько паратезов для уточнения порядка оценки:

(x & (~((uint32_t)CST_IEc)))

Сначала CST_IEc преобразуется в uint32_t, затем оно поразрядно аннулируется с помощью ~, а затем по битам аннулируется с x до &.

4 голосов
/ 17 марта 2010
  • Бит (uint32_t) является приведением к типу беззнакового целого (32 бита),
  • ~ означает, что по битам нет (или дополнение), поэтому он инвертирует биты в CST_IEc после того, как преобразован в uint32_t.
4 голосов
/ 17 марта 2010

Вы неправильно интерпретируете приоритет оператора. Приведение (uint32_t)CST_IEc выполняется первым, а ~ происходит после этого. Обратитесь за помощью к таблице приоритетов операторов.

3 голосов
/ 17 марта 2010

Вы должны прочитать выражение немного по-другому:

(uint32_t)CST_IEc

Преобразует значение CST_IEc в 32-разрядное целое число без знака.

~(uint32_t)CST_IEc;

Затем ~ выполняет побитовую инверсию значения; каждый бит становится нулем, а каждый нулевой бит становится единицей.

Тогда все выражение выглядит так:

x & ~(uint32_t)CST_IEc;

Это означает, что результат содержит биты в x, за исключением битов, подразумеваемых значением CST_IEc; те обнулены.

Итак, если бы CST_IEc было, например, 0x0F00, а входное значение x было 0x12345678, результат был бы 0x12345078.

3 голосов
/ 17 марта 2010
(uint32_t)CST_IEc; //casting CST_IEc to uint32_t

~( ) //taking one's complement
2 голосов
/ 17 марта 2010

Разве (uint32_t) не является приведением типа?

~ поразрядно НЕ

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