2010-01-09 111 views
3

以下哪項返回63長(在Java中)以及如何?二進制標誌的十六進制組合

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

我正在使用NetworkManager API標誌(如果有幫助的話)。我從一個操作中獲得了63個,但不知道應該如何將返回值與描述相匹配。

由於

回答

18

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)) 
{ 
} 

PS:要了解爲什麼這個作品,this是關於二元標誌及其組合的不錯文章。

+0

@stakx:當然,這只是一個錯字。對不起 - 修正 – 2010-01-09 08:34:32

+3

@staks ...如果你這樣做,只需編輯它。現在是正確的,所以我+1了 – DJTripleThreat 2010-01-09 08:42:00

+0

只是另一個很小的更正 - 0x02是從右邊第二位,而不是第三位。 – Chowlett 2010-01-09 09:15:22

1

63(十進制)等於0x3F(十六進制)。所以63是以下所有標誌的組合:

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

這是你在找什麼?

2

我給你和克里斯一樣的答案:你的返回值0x63看起來像是你在列表中提到的所有標誌的組合(除了0x0)。

當處理標誌時,一個簡單的方法可以手工計算出哪些標誌被設置,即將所有數字轉換爲它們的二進制表示。如果你已經有十六進制的數字,這很容易,因爲每個數字對應四位。首先,你的號碼清單:

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

現在,如果你把你的值63,這是0x3F(= 3 * 16 + F * 16 ,其中F = 15)十六進制,它變爲:

0x3F 
    | 
    | 
    V 
0011 1111 

您很快就會看到低6位全部被設置,這是上述二進制數的「加法」組合(按位或)。