Как это читается/работает?

Сообщения
92
Реакции
23
Всем привет. Не пойму как работает это условие, что обозначает "~", что обозначает "&", что обозначает "|" в скобках.

Код:
new iBitsDamageType = get_pdata_int( iVictim, m_bitsDamageType );

if( ~iBitsDamageType & ( DMG_NEVERGIB | DMG_BULLET ) )
{
//
}
 

Garey

ninjaCow
Сообщения
440
Реакции
1,094
Помог
11 раз(а)
Сообщения
678
Реакции
579
Предупреждения
8
Помог
9 раз(а)
Вместо
Код:
if( ~iBitsDamageType & ( DMG_NEVERGIB | DMG_BULLET ) )
{
//
}

Лучше так
Код:
if( !(iBitsDamageType & ( DMG_NEVERGIB | DMG_BULLET ) ))
{
//
}
 
Сообщения
39
Реакции
103
Vaqtincha, как по мне первый вариант читабельнее
 
Сообщения
39
Реакции
103
Думаю правильнее объяснить так
Код:

/*
Делаем побитовое отрицание, то есть все 0 превращаются в 1, а все 1 — в 0.
Пример: ~1110101 == 0001010
*/
new a = ~iBitsDamageType;

/*
Получаем новое число, в котором содержаться единицы, и из DMG_NEVERGIB, и из DMG_BULLET
Пример: (101 | 110) == 111
*/
new b = ( DMG_NEVERGIB | DMG_BULLET );

/*
Выполняем условие, когда a и b имеют пересекающиеся биты․
Пример: (100 & 111) == 100
В данном случае получается, что условие выполнится, если iBitsDamageType не содержит ни DMG_NEVERGIB ни DMG_BULLET
*/
if((a & b) != 0) // Эквивалентно: if(a & b)
{
//
}
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу