Помогите с побитовыми операциями

Я хочу перепроверить часть своей логики в отношении сторонней функции, которую я использую, и я не уверен, правильно ли я понял побитовую логику или нет. Может ли кто-нибудь дать мне диапазон значений для переменной «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 {

        }

person snappymcsnap    schedule 08.07.2011    source источник
comment
Как насчет того, чтобы рассказать нам, что вы думаете о них, и мы начнем с этого!   -  person Oliver Charlesworth    schedule 09.07.2011


Ответы (2)


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 полностью избыточны, если тип переменной знаковый.

person Ben Voigt    schedule 08.07.2011
comment
Я думаю, вы имеете в виду, если тип переменной un подписан? - person Lii; 18.02.2015
comment
@Lii: Нет, я этого не делал. Последующий тест проверяет бит знака. - person Ben Voigt; 18.02.2015
comment
И я предполагаю, что если переменная не имеет знака, тесты одинаково избыточны, поскольку она не может содержать отрицательные значения? - person Lii; 18.02.2015
comment
@Lii: Тоже правильно. Но избыточен по-другому (подразумевается типом данных, а не другим предложением в тесте). - person Ben Voigt; 18.02.2015

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

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

Видеть:

С# конвертирует целое число в шестнадцатеричное и обратно

person Chuck Savage    schedule 08.07.2011