2013-10-07 106 views
0

要插入該值,首先使用掩碼來清除與給定顏色通道對應的像素的8位。例如,在紅色的情況下,移動一個8位掩碼(保留16位),將其反轉(使用〜運算符)和「和」(&)此掩碼和RGB值,這將清除8位紅色,並保持其他位不變。接下來,移動參數值(在本例中爲紅色)的位數保持不變(在紅色情況下爲16),並將「或」(|)移位後的值轉換爲像素值。移位位java

int getRed(){ 
    red = (Pixel>>16); 
    red = ~Pixel; 
    red = Pixel<<16 | Pixel; 
    return red; 
} 

根據指示我做錯了什麼?

+3

您應該在後續操作中重新使用'red'值。由於'Red'總是由'Pixel'上的某個操作分配的,因此您不會累積3次操作,只執行3次獨立操作。 – jtahlborn

+3

您正在爲「紅色」分配三個不同的值。前兩個的結果被第三個結果覆蓋,所以這是你得到的唯一結果。 –

回答

2

這裏的問題似乎是理解賦值如何工作的基本問題(在Java中......以及幾乎所有命令式編程語言!)。例如:

red = (Pixel>>16); 
red = ~Pixel; 

即說:

  1. 分配到redPixel 16位

  2. 分配到redPixel值按位求反移位的值。這clobbers您在上一步中計算的值red

如果要否定在步驟1中計算出的值,那麼你需要做的是:

red = ~red; 
1

我相信你根本不明白髮生了什麼事情。第一行已經是不正確的:

它說,「在紅色的情況下,移動一個8位掩碼的剩餘16位,反轉它(使用〜運算符)和」和「(&)此面膜具有RGB值」

這意味着

8 bit mask of ones: 0xFF (00000000 00000000 00000000 11111111) 
shift left 16 bits: 0xFF << 16 (giving you 00000000 11111111 00000000 00000000) 
invert it   : ~ (0xFF << 16) (giving you (11111111 00000000 11111111 11111111) 
& this mask with RGB value: result = pixel & (~(0xFF << 16)) 

resultpixel與17月24日清零。

這是第一階段(你的功課描述是有後續步驟)設置在pixel

「紅」值,我不知道這是否是你的意圖,但你開發無關用你的問題來做:而不是設置紅色值,看來你得到紅色值。

但是,您所開發的仍然是遠遠不夠的。例如你應該有一個類似的掩碼,其中第17到第24位是1,其他位是0,然後&這個掩碼的像素,然後將剩餘的值(位於第17到第24位)移到第0到7位。

我不會給你實際的答案,因爲這是你的工作,從中吸取教訓。不過,我相信我給出的提示是綽綽有餘的。