2015-09-02 40 views
1

在Java中:十六進制:在一個int中設置一個8位字節

我有一個十六進制形式的32位數字。我給出了一個特定的字節數(0-3,0爲最不重要的字節),並告訴我需要用另一個以十六進制形式給我的字節替換該字節。例如:32位數字0xAAA5BBC6,用0x17替換字節1得到0xAAA517C6。

我不能使用任何鑄造,乘法,加法,減法或條件。我不能寫任何助手方法,或者從這個或其他文件中調用任何其他方法來實現任何方法。此外,這必須寫在一行代碼中。

我相信我應該使用掩蔽,但我不知道從哪裏開始。給定一個字節數,我怎樣才能改變所有的8位。切換一個或者打開很容易,但是切換所有8位是一個特定的值?

+1

想想你如何屏蔽一個位......然後嘗試以相同的方式屏蔽8個連續的位.. – Buddy

+0

看看位移運算符。用它們將位掩碼移動到位。 – Thilo

+0

請注意:字節編號的方式不是通用的。通常,32位數字的低位字節稱爲「字節0」,但我已經看到了其他方式 - 我已經看到它稱爲字節3,字節0爲高位8位,而且我甚至碰到了那些稱之爲字節4的人。所以當提出這樣的問題時,最好澄清一下。如果你不知道,那麼你需要詢問告訴你這樣做的人。 – ajb

回答

0

在一條線,假設字節正在從最有意義的字節數:

int updatedValue = originalValue & ~(0xFF << (byteNumber << 3)) | ((((int)newByte) & 0xFF) << (byteNumber << 3)); 

其中:
originalValue是原來的32位整數
newByte是您將得到更換字節老字節
byteNumber是字節數(0-3)

什麼代碼所做的是以下幾點:

  • 創建一個掩碼來「刪除」舊字節(清除該字節的位)。爲了創建掩模:

    • 創建將所有的位(均在1)的字節的掩模0xFF
    • 抵消這種掩模的字節的位置被「已刪除」,它必須是要被「刪除」的字節數的8倍。由於我無法相乘(限制的一部分),所以我將這個數字向左偏移3位(相當於乘以8,記住將位向左移位等於乘以2,等等一個3的偏移將會是2 * 2 * 2 = 8)這是通過這段代碼完成的:(byteNumber << 3)
    • 「切換」掩碼的位與~,所以我有掩碼來「刪除」字節: ~(0xFF << (byteNumber << 3))在這一點上,你面具會,說FFFF00FF如果你想清楚字節#1
  • 原來的號碼,並在第一步中創建的面具之間執行和逐位操作:~(0xFF << (byteNumber << 3))

  • 用新的字節創建一個32位的整數並將其位偏移到該字節的位置。再次,偏移量已完成(byteNumber << 3)已經解釋。
  • 執行或者逐位操作與所述第二步驟的結果來設置新字節的位(這是的代碼行,最後一步)

現在,對於其原因,我在做((int)newByte) & 0xFF),而不是僅僅((int)newByte))或只是newByte,就是JVM所做的操作<<,這可能具有不希望的效果,如果你的newByte大於0x7F的大前提升到int操作byte(例如,中0x80值會投射到int作爲0xFFFFFF80而不是0x00000080)。通過做((int)newByte) & 0xFF)我自己進行升級到int,並清除不需要的位以防萬一。

+0

這完全正確@morgano。我只需要看看它,並試圖瞭解到底發生了什麼。它開始變得更有意義了,特別是當添加rakeb.void的評論時。 –

+0

回答更新以解釋它是如何工作的。 – morgano

+0

我不能告訴你這幫了我多少!我能夠在很短的時間內解決下一個問題! 「返回nibble從十六進制給出的32位數字和哪個nybble」 返回(num&(0xF <<(其中<< 2))) >>(其中<< 2); –

0

您如何創建一個方法(或類構造函數),其目的是專門分析十六進制值並將其轉換爲您想要的任何數據類型。 我強烈建議您閱讀關於數據翻譯的內容或在YouTube上觀看關於它的視頻,並查看它與您的案例的關係。 祝你好運! - 最大

0

看看下面的例子:

input = AA  A5   BB  C6 (in hex) 
input = 10101010 10100101 10111011 11000110 (in binary) 
mask = FF  FF  00  FF (in hex) 
mask = 11111111 11111111 00000000 11111111 (in binary) 
------------------------------------------------------- 
input = 10101010 10100101 00000000 11000110 (bitwise AND) 
replace = FF  FF  17  FF (in hex) 
replace = 11111111 11111111 00010111 11111111 (in binary) 
------------------------------------------------------- 
input = 10101010 10100101 00010111 11000110 (bitwise OR) 
input = AA  A5   17  C6 (in hex) 

最後一行是你所需的輸出。如您所見,有兩個按位操作,AND and OR。你必須學習很多才能知道工作。

+0

這有助於很多,感謝@ rakeb.void的信息。在這個意義上,我們剛剛開始與這些運營商合作。這看起來很先進。 –

相關問題