Ответ 1
Это оператор побитового дополнения, также известный как побитовое отрицание.
Возможный дубликат:
Что такое тильда (~) в перечислении на С#?
Я нашел следующий бит кода на этой странице MSDN.
(((Width * Planes * BitCount + 31) & ~31) / 8) * abs(Height)
Это действительно компилируется в С# visual studio 2010. Что такое тильда "~" перед номером 31? Я никогда раньше не видел этот синтаксис в выражении.
Это оператор побитового дополнения, также известный как побитовое отрицание.
~
- побитовый оператор NOT, в основном инвертирует биты
31 в двоичном формате - 11111, поэтому ~ 31 == 00000, в основном 0
Вы переходите к своей удобной копии ISO/IEC 23270: 2006 — Информационные технологии — Языки программирования — С# и перейдите к разделу 14.6.4 о святой записи. Там вы найдете:
14.6.4 Оператор побитового дополнения
Для операции вида ~ x применяется унитарное разрешение перегрузки (§14.2.3) оператора для выбора конкретной реализации оператора. Операнд преобразуется в тип параметра выбранного оператора, а тип результата - тип возвращаемого значения оператора. Предопределенные операторы битового дополнения:
int operator ~( int x ) ;
uint operator ~( uint x ) ;
long operator ~( long x ) ;
ulong operator ~( ulong x ) ;
Для каждого из этих операторов результатом операции является поразрядное дополнение к x.
Каждый тип перечисления E неявно предоставляет следующий оператор поразрядного дополнения:
E operator ~(E x);
Результат оценки ~x
, где x
- выражение типа перечисления E
с базовым типом U
, точно так же, как и оценка unchecked((E)(~(U)x))
. Этот оператор рассматривается только с помощью унарного разрешения перегрузки по операциям, когда тип операнда является типом перечисления E
(§14.2.3).
Поднятые (§14.2.7) формы предопределенных заранее определенных операторов побитового дополнения также определены заранее.
В вашем случае ~31
совпадает с ~ 0x0000001F
. Побитовое сжатие 0x0000001F
равно 0xFFFFFFE0
. Почему они не просто напишут, что настоящая маска, которую они хотели, находится вне меня.
Это оператор побитового дополнения.
В принципе, он переворачивает бит:
0xffff0000 == ~0x0000ffff
В коде, который вы опубликовали, выполнение & ~31
гарантирует, что последние 5 бит равны 0 (побитовое и дополнение 11111, которое равно 00000).
Это побитовый оператор дополнения - он просто превращает все 0 бит в 1 и наоборот... см. ссылка MSDN.
В вашем конкретном случае он просто создает (31 = 0x1F
):
~0x1F = 0xFFFFFFE0
Он используется с bitwise and (&)
и, следовательно, в основном он отменяет последние 5 бит.
~ 31 = побитовое отрицание 31 и в этом конкретном случае используется для того, чтобы свести к нулю первый (из LSB) 5 бит (Width * Planes * BitCount + 31)