十六进制组合二进制标志

时间:2010-01-09 08:25:37

标签: numbers hex

以下哪一项回复63(在Java中)以及如何?

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

如果有帮助,我正在使用NetworkManager API标志。我从其中一个操作中得到63,但不知道如何将返回值与描述匹配。

由于

3 个答案:

答案 0 :(得分:19)

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。:要了解其工作原理,this是关于二进制标志及其组合的好文章。

答案 1 :(得分:2)

我会给你与克里斯相同的答案:你的返回值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位全部被设置,这是上述二进制数的“加性”组合(按位OR)。

答案 2 :(得分:1)

63(十进制)等于0x3F(十六进制)。所以63是所有以下标志的组合:

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

那是你在找什么?