Вам следует использовать побитовый оператор &, например: const int MASK_SYNTAX_ERR = -2146827000;if (MASK_SYNTAX_ERR & scode! = 0) scriptError.GetSourceLineText (out sourceLine);
Подробнее о том, что происходит.
Двоичное представление MASK_SYNTAX_ERR:
1000 0000 0000 1010 0000 0101 0000 1000
Это сравнение вернет true для любого числа с 1 в тех же позициях.Возьмите ваш первый синтаксический код ошибки, например:
MASK 1000 0000 0000 1010 0000 0101 0000 1000
CODE 1000 0000 0000 1010 0000 0011 1110 1111
& 1000 0000 0000 1010 0000 0001 0000 1000 != 0
Таким образом, маска работает здесь.Теперь, сравнивая логический код ошибки:
MASK 1000 0000 0000 1010 0000 0101 0000 1000
CODE 1000 0000 0000 1010 0001 0011 1000 1111
& 1000 0000 0000 1010 0000 0001 0000 1000 != 0
Здесь также работает, чего не должно быть.Похоже, что ваша выведенная маска может быть неправильной, потому что она слишком сложная.Глядя на ваши синтаксические коды и логические коды вместе:
SYNTAX 1000 0000 0000 1010 0000 0011 1110 1111
1000 0000 0000 1010 0000 0011 1111 0001
1000 0000 0000 1010 0000 0011 1111 0000
1000 0000 0000 1010 0000 0011 1110 1101
1000 0000 0000 1010 0000 0011 1110 1100
LOGIC 1000 0000 0000 1010 0001 0011 1000 1111
1000 0000 0000 1010 0001 0011 1001 0001
Похоже, что 13-й бит слева является ключевым отличием между логическими ошибками и синтаксическими ошибками.Таким образом, вы можете сделать что-то вроде этого:
const int SYNTAX_MASK = 1 << 12;
if (scode & SYNTAX_MASK != 0)
{
//It's a syntax error
scriptError.GetSourceLine(out sourceLine);
}
else
{
//It's a logic error
}
Вы можете использовать аналогичный анализ, чтобы выяснить маски для других целей.Много раз маска используется для получения единственного бита от целого, а не чего-то сложного, как у вас.Возможно, часть кода 0x800A означает определенный тип ошибки, а последняя часть содержит информацию об ошибке.Вам придется провести некоторые эксперименты самостоятельно, но, надеюсь, это поможет вам выбрать правильные пути для создания битовых масок.