Как я могу сделать эту проверку int шаблон более эффективно? - PullRequest
0 голосов
/ 27 января 2012

Вот некоторый код, который принимает код ошибки int (scode) и пытается определить, соответствует ли он определенному шаблону. Должен ли я использовать оператор деления по модулю, чтобы сделать это?

const int MASK_SYNTAX_ERR = -2146827000;
if ((MASK_SYNTAX_ERR % scode) == MASK_SYNTAX_ERR)
    scriptError.GetSourceLineText(out sourceLine);

Справочная информация: мне пришлось вывести значение MASK_SYNTAX_ERR путем наблюдения. Вот различные синтаксические коды ошибок, которые я наблюдал:

// -Int Value (Formatted Value "0x{0:X8}")
-2146827281 (0x800A03EF)
-2146827279 (0x800A03F1)
-2146827280 (0x800A03F0)
-2146827283 (0x800A03ED)
-2146827284 (0x800A03EC)

Вот пара логических кодов ошибок для сравнения:

-2146823281 (0x800A138F)
-2146823279 (0x800A1391)

(Общая информация: сам код вызывает IActiveScriptError.GetSourceLineText, это из реализации IActiveScriptSite.OnScriptError.)

Ответы [ 2 ]

3 голосов
/ 27 января 2012

Для операций маскирования вы обычно используете двоичный файл и оператор (&).Я также рекомендую шестнадцатеричное обозначение, чтобы прояснить, как работает маска.

if (data & MASK == MASK)
{
    DoStuff();
}
1 голос
/ 27 января 2012

Вам следует использовать побитовый оператор &, например: 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 означает определенный тип ошибки, а последняя часть содержит информацию об ошибке.Вам придется провести некоторые эксперименты самостоятельно, но, надеюсь, это поможет вам выбрать правильные пути для создания битовых масок.

...