Помогите с побитовыми операциями - PullRequest
2 голосов
/ 09 июля 2011

Я хочу перепроверить некоторую часть своей логики с использованием сторонней функции, которую я использую, и я не уверен, правильно ли я понял битовую логику или нет.Может ли кто-нибудь дать мне диапазон значений для переменной 'intValue' в каждом сценарии, который заставит каждое условие возвращать true?спасибо!

        if ((intValue < 0 && ((intValue & 0xFFFFFF80) == 0xFFFFFF80)) ||
            (intValue & 0x0000007F) == intValue) {

        }
        else if ((intValue < 0 && ((intValue & 0xFFFF8000) == 0xFFFF8000)) ||
            (intValue & 0x00007FFF) == intValue) {

        }
        else if ((intValue < 0 && ((intValue & 0xFF800000) == 0xFF800000)) ||
            (intValue & 0x007FFFFF) == intValue) {

        }
        else {

        }

Ответы [ 2 ]

2 голосов
/ 09 июля 2011
if (intValue == (SByte)intValue) {
     // matches -128...127, i.e. values that fit in one byte
}
else if (intValue == (Int16)intValue) {
     // matches -32768..32767, values that fit in two bytes
}
else if (intValue == ((intValue << 8) >> 8)) {
     // matches -2**23..(2**23-1), values that fit in three bytes
}
else {
     // matches -2**31..(2**31-1), values that need four bytes
}

Обратите внимание, что все intValue < 0 тесты полностью избыточны, если тип переменной подписан.

0 голосов
/ 09 июля 2011

Вот подсказка:

int intValue = int.Parse("FFFFFF80", System.Globalization.NumberStyles.HexNumber);

См:

C # конвертировать целое число в гекс и обратно

...