«Значение» варьируется от 0 до 15 (его возможные значения). Когда эти 4 условия "если" будут выполнены? Если my (int) value = 2, значит ли это 0010?
if ((int)value & 0x1)
{
//statement here
}
if ((int)value & 0x2)
{
//statement here
}
if ((int)value & 0x4)
{
//statement here
}
if ((int)value & 0x8)
{
//statement here
}
c++
bitwise-operators
Шон Маккарти
источник
источник
value
(читаетсяif(value & 0x4)
как «3-й битvalue
установлен (= 1)). Поскольку у вас, по-видимому, есть проблемы с пониманием кода, я предполагаю, что он не ваш. Это (и тот факт, что вы не спрашиваете» для обзора) делает этот вопрос не по теме для CR.SE .Enum.HasFlag
метод для проверки битов. Смотрите: Enum.HasFlag .Ответы:
Каждое число может быть выражено как
value = b0*2^0 + b1*2^1 + b2*2^2 + b3*2^3 + ...
с каждым b, являющимся или0
или1
(это биты представления). Это двоичное представление.Двоичный AND (
&
) принимает каждую из этихb
пар и выполняет AND на них. Это имеет следующие выводы:Используя степени 2 (которые имеют только один бит), мы можем выделить и проверить отдельные биты:
value & 1
истинно, когдаvalue
нечетно {1, 3, 5, 7, 9, 11, 13, 15}.value & 2
верно, когдаvalue/2
нечетное {2, 3, 6, 7, 10, 11, 14, 15}.value & 4
верно, когдаvalue/4
нечетное {4, 5, 6, 7, 12, 13, 14, 15}.value & 8
верно, когдаvalue/8
нечетное {8, 9, 10, 11, 12, 13, 14, 15}.Значение 0x на числах означает, что его следует интерпретировать как шестнадцатеричное число . Это немного излишне, когда вы поднимаетесь только до 0x8, но указывает сопровождающим, что он, вероятно, используется в качестве битовой маски.
источник
8/6
является нечетным, а8&6
возвращает ложным.Эти операторы if проверяют, установлен ли определенный бит
value
.0x4
Например, шестнадцатеричное значение имеет 3-й бит справа, установленный в,1
а все остальные биты - в0
. Когда вы используете двоичные операторы and и ((&
) с двумя оперантами, результат будет иметь все биты,0
кроме тех, которые равны 1 в обоих оперантах.Поэтому , когда вы делаете расчет
value & 0x4
, вы либо получить двоичный00000000
или двоичный00000100
, в зависимости от того , или нет 3 - й битvalue
является1
или0
. Первое вычисляется какfalse
, а второе какtrue
, поэтому блок if выполняется только для значений, в которых установлен 3-й бит.источник
Здесь нужно отметить две интересные вещи.
Во-первых, это общий шаблон для проверки каждого из 4 младших битов интегрального значения. Условие if выполняется, если установлен соответствующий бит. Для значения 2 битовая комбинация действительно равна 0010.
Другой, более интересный вопрос: почему
(int)
актеры? Помимо плохого стиля использования C-приведений в C ++, никакие целочисленные или символьные значения не требуют этого приведения. Значение bool не имеет смысла, значение double / float будет преобразовано во временное целое число, и было бы необычно использовать буквальные значения для проверки перечисления. Это может иметь смысл с указателем, но это будет очень специализированное использование. Вывод: актерский состав не имеет смысла.источник