Подтвердить что ты не робот

Что означает тильда в выражении?

Возможный дубликат:
Что такое тильда (~) в перечислении на С#?

Я нашел следующий бит кода на этой странице MSDN.

(((Width * Planes * BitCount + 31) & ~31) / 8) * abs(Height)

Это действительно компилируется в С# visual studio 2010. Что такое тильда "~" перед номером 31? Я никогда раньше не видел этот синтаксис в выражении.

4b9b3361

Ответ 2

~ - побитовый оператор NOT, в основном инвертирует биты

31 в двоичном формате - 11111, поэтому ~ 31 == 00000, в основном 0

Ответ 3

Вы переходите к своей удобной копии 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. Почему они не просто напишут, что настоящая маска, которую они хотели, находится вне меня.

Ответ 4

Это оператор побитового дополнения.

В принципе, он переворачивает бит:

0xffff0000 == ~0x0000ffff

В коде, который вы опубликовали, выполнение & ~31 гарантирует, что последние 5 бит равны 0 (побитовое и дополнение 11111, которое равно 00000).

Ответ 5

Это побитовый оператор дополнения - он просто превращает все 0 бит в 1 и наоборот... см. ссылка MSDN.

В вашем конкретном случае он просто создает (31 = 0x1F):

~0x1F = 0xFFFFFFE0

Он используется с bitwise and (&) и, следовательно, в основном он отменяет последние 5 бит.

Ответ 6

~ 31 = побитовое отрицание 31 и в этом конкретном случае используется для того, чтобы свести к нулю первый (из LSB) 5 бит (Width * Planes * BitCount + 31)