Шестнадцатеричная комбинация бинарных флагов - PullRequest
3 голосов
/ 09 января 2010

Что из перечисленного возвращает 63 как долго (в Java) и как?

0x0
0x1
0x2
0x4
0x8
0x10
0x20

Я работаю с флагами NetworkManager API, если это поможет. Я получаю 63 от одной из операций, но не знаю, как мне сопоставить возвращаемое значение с описанием.

Спасибо

Ответы [ 3 ]

19 голосов
/ 09 января 2010

63 - 32 | 16 | 8 | 4 | 2 | 1, где | - двоичный или оператор .

Или другими словами (в шестнадцатеричном формате): 63 (что составляет 0x3F) равно 0x20 | 0x10 | 0x8 | 0x4 | 0x2 | 0x1. Если вы посмотрите на них все в двоичном виде, это очевидно:

0x20 : 00100000
0x10 : 00010000
0x08 : 00001000
0x04 : 00000100
0x02 : 00000010
0x01 : 00000001

А 63 - это:

0x3F : 00111111

Если вы получаете какой-то статус возврата и хотите знать, что это значит, вам придется использовать бинарный и . Например:

if (status & 0x02) 
{
}

Выполняется, если флаг 0x02 (т. Е. 2-й бит справа) включен в возвращаемом состоянии. Чаще всего эти флаги имеют имена (описания), поэтому приведенный выше код будет выглядеть примерно так:

if (status & CONNECT_ERROR_FLAG)
{
}

Опять же, статус может быть комбинацией вещей:

// Check if both flags are set in the status
if (status & (CONNECT_ERROR_FLAG | WRONG_IP_FLAG))
{
}

P.S .: Чтобы узнать, почему это работает, это - хорошая статья о бинарных флагах и их комбинациях.

2 голосов
/ 09 января 2010

Я бы дал вам тот же ответ, что и Крис: ваше возвращаемое значение 0x63 выглядит как комбинация всех флагов, которые вы упоминаете в своем списке (кроме 0x0).

При работе с флагами одним простым способом выяснить, какие флаги установлены вручную, является преобразование всех чисел в их двоичное представление. Это особенно легко, если у вас уже есть числа в шестнадцатеричном формате, поскольку каждая цифра соответствует четырем битам. Во-первых, ваш список номеров:

   0x01           0x02           0x04        ...        0x20
    |              |              |                      |
    |              |              |                      |
    V              V              V                      V
0000 0001      0000 0010      0000 0100      ...     0010 0000

Теперь, если вы возьмете значение 63, которое равно 0x3F (= 3 * 16 1 + F * 16 0 , где F = 15) в шестнадцатеричном виде оно становится:

   0x3F
    |
    |
    V
0011 1111

Вы быстро видите, что все младшие 6 битов установлены, что является «аддитивной» комбинацией (побитовое ИЛИ) вышеуказанных двоичных чисел.

1 голос
/ 09 января 2010

63 (десятичное число) равно 0x3F (шестнадцатеричное). Итак, 63 представляет собой комбинацию всех следующих флагов:

0x20
0x10
0x08
0x04
0x02
0x01

Это то, что вы искали?

...