二进制标志的十六进制组合

3
以下哪个方法可以在Java中返回长整型63?如何实现?
0x0
0x1
0x2
0x4
0x8
0x10
0x20

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

谢谢

3个回答

20

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标志(也就是从右边数第二个比特位),则将执行。通常,这些标志都有名称(描述),因此上面的代码将会读取类似于:

if (status & CONNECT_ERROR_FLAG)
{
}

再次强调,状态可以是一堆东西的组合:

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

P.S.:要了解为什么这有效,请参阅这篇关于二进制标志及其组合的好文章。


@stakx:这只是一个打字错误,当然了。对此感到抱歉 - 已经修复。 - Eli Bendersky
3
如果你给这个内容点了一个负一的赞,可以选择编辑它而不是删除。现在它已经正确了,所以我给它点了一个加一的赞。 - aarona
只是另一个非常小的更正 - 0x02 是从右边数第二位,而不是第三位。 - Chowlett
谢谢!我接受你的答案。但是我认为应该这样写才能正确地检查标志是否打开:if ((status & CONNECT_ERROR_FLAG==CONNECT_ERROR_FLAG)) { } - ashokgelal
很遗憾这篇好文章已经消失了,不过还是谢谢您的解释。 - SSH This
显示剩余2条评论

2
我会给你和Chris相同的答案:你的返回值0x63似乎是你列表中提到的所有标志的组合(除了0x0)。
处理标志时,一种简单的方法是手动将所有数字转换为它们的二进制表示。如果您已经拥有十六进制数字,则这尤其容易,因为每个数字对应四位。首先,看一下您的数字列表:
   0x01           0x02           0x04        ...        0x20
    |              |              |                      |
    |              |              |                      |
    V              V              V                      V
0000 0001      0000 0010      0000 0100      ...     0010 0000

现在,如果你拿到数值63,它在十六进制中表示为0x3F(= 3 * 161 + F * 160,其中F = 15),那么它就变成了:

   0x3F
    |
    |
    V
0011 1111

您很快就会发现,低6位都被设置了,这是上述二进制数的“加法”组合(按位或)。


1

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

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

这是你在寻找的吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接