2015-06-24 153 views
0

我在php中做了一些代碼,這是一個關於實現代表顏色的類的練習。rgb值到php中的r,g,b值

該課程是爲了讓我可以收到3個'紅','綠'和'藍'值,這些值不會打擾我,但我也可以收到'rgb'值。

最後,這裏是其中的伎倆來處理「RGB」情況下,代碼:

if (array_key_exists('rgb', $kwargs)) 
{ 
$this->red = intval($kwargs['rgb']) >> 16 & 255; 
$this->green = intval($kwargs['rgb']) >> 8 & 255; 
$this->blue = intval($kwargs['rgb']) & 255; 
} 

不過,我真的不明白爲什麼我們需要「& 255」。

爲什麼我不能簡單地單獨使用右移來將值轉換回來?

我的意思是,如果我收到:'rgb'中的00000001 00000001 00000001,如果我>> 16,我應該得到1,如果我>> 8,我也應該得到1, ?我看了'&'操作符,它說它應該作爲一個掩碼(如果我正確理解了掩碼的概念),但是在掩碼操作之後,我仍然會得到與(1,1,1)之前。我不明白爲什麼這個'& 255'是必要的(我試過沒有它,它不工作)。

感謝任何花時間回答我的人。

+0

您的代碼是否按照您期望的那樣工作? – Rizier123

回答

2

& 255是爲了確保您只接收此掩碼內的值(它們是前8位集)。這是爲了確保你只能得到「R」,「B」或「G」組件,而不是其他任何東西。

例子:

RGB:  11001100 10101010 11110000 

RGB >> 16: ???????? ???????? 11001100 
    & 255: 00000000 00000000 11111111 
      -------------------------- 
           11001100 (red) 

RGB >> 8: ???????? 11001100 10101010 
    & 255: 00000000 00000000 11111111 
      -------------------------- 
           10101010 (green) 

RGB  : 11001100 10101010 11110000 
    & 255: 00000000 00000000 11110000 
      -------------------------- 
           11110000 (blue) 

所以這些線在本質上做的是「轉變」要開始,只取你是通過屏蔽它感興趣的(第8位)的一部分的值。

+0

如果OP以這種格式接收他的數據:'00000001 00000001 00000001'我不認爲他的代碼是按照他想要的方式工作的。 (但我非常喜歡你的榜樣,它很好地解釋了它,發生了什麼) – Rizier123

0

你的假設是有缺陷的8移

00000001 00000001 00000001權給00000001 00000001這是不是你想....屏蔽,通過25511111111)將所有位,但那些在最顯著字節結果0,給出00000000 00000001,這是正確的結果

0

感謝所有回答的人。我現在明白這個面具是如何工作的。

並回答Rizier123,是的,代碼工作,我通過了練習,我只是要求解釋,我討厭提交一個代碼,其中的一部分在我腦海中不清楚。我被接收表單上的數據:

「十進制int值」可能跟隨「< < 8」或「< < 16」

我只使用位格式來解釋我的例子。