2014-06-16 79 views
-1

當我在發佈位掩碼之前通過大量網站時,我所理解的是它用於切換1和0之間的切換,並且通常用於基於像素的圖形項目。現在作爲一個初學者真的不明白爲什麼我們切換開關,以及它如何用於圖形.. 也爲什麼我們使用位掩碼來提取位無符號右移位和位掩碼的應用

+1

爲什麼用三種不同的語言標記,當你似乎只談論Java?規則擴展和位移不能期望在隨機編程語言集合中是相同的...... – unwind

回答

3

答案在於JLS。 5.6.2節:

加寬原語轉換(§5.1.2)被施加到轉換的任一個或由下面的規則中指定的兩個操作數:

  • 如果操作數的類型是雙,所述其他轉換爲雙倍。
  • 否則,如果任一操作數的類型爲float,則另一個操作數轉換爲float。
  • 否則,如果任一操作數的類型爲long,則另一個操作數轉換爲long。
  • 否則,兩個操作數都轉換爲int類型。

最後一點值得關注。這意味着兩個b轉換爲int之前執行轉換操作。

因此,原來爲0xF1b被提升爲0xFFFF FFF1

然後進行移位:

0xFFFF FFF1 >>> 4 == 0x0FFF FFFF 

然後澆注到byte

(byte) 0x0FFF FFFF == 0xFF 

,你會得到b == -1


e是15因爲面具。

首先,b0xF1提升爲0xFFFF FFF1

然後是AND ED與0xFF

0xFFFF FFF1 & 0x0000 00FF == 0x0000 00F1 

然後右移4位:

0x0000 00F1 >> 4 == 0x0000 000F 

然後將其強制轉換爲byte

(byte) 0x0000 000F == 0x0F 

你得到e == 15

編輯:沒有擊中「F」足夠的次數,最後以16位int s ...希望修復,謝謝@Stefan!

+1

即使點保持不變,Java int也不是32位,而不是16? – Stefan

+0

@Stefan對,在更多'F's上得到更多的力量......感謝你的收穫! – awksp