2010-08-10 67 views
5

我讀了一篇簡短的「C.Sharp 3.0」書,並且遇到了下一段代碼,這讓我感興趣。這個不安全的代碼是如何工作的?

unsafe void RedFilter(int[,] bitmap) 
    { 
     int length = bitmap.Length; 
     fixed (int* b = bitmap) 
     { 
     int* p = b; 
     for(int i = 0; i < length; i++) 
      *p++ &= 0xFF; 
     } 
    } 

任何人都可以解釋我是如何做到這一點 「* P ++ & = 0xFF的」 工作?

回答

9

該功能可能是爲了取得位圖圖像,並過濾除紅色以外的所有顏色。

這假設它是一個32位位圖,其中每個像素都由int表示。 您正在取消引用p(這是一個int)當前指向的內存位置,並將其與0xFF進行邏輯與運算,該邏輯實際上只保留像素的紅色分量(假設最低字節是紅色分量)。您還將自動遞增指向下一個int(與++)的指針。這是否回答?

+0

感謝您的解釋。是的,所有的回答都非常有用。 – 2010-08-11 07:57:03

+0

那麼爲什麼不接受答案呢? – 2013-10-08 14:36:16

6

這是相同的,因爲這(IMO原來*p++ &= 0xFF;訣竅是有點討厭的 - 它是一行代碼正在做兩兩件事):

*p = *p & 0xFF; 
p++; 

a = a & 0xFF組所有,但低8位的表達式變量a歸零。

+0

感謝您的解釋。 – 2010-08-11 07:56:25

1

此代碼增加指針p,使其指向位圖中的下一個像素,然後屏蔽除最低有效字節以外的所有內容,其中Microsoft BMP格式(以及我在其他非標準實現中假設)位於BGR格式。

這有除去紅色以外的所有顏色成分的作用。

+0

感謝您的解釋。 – 2010-08-11 08:17:24

1

正如你可能知道,

x &= y 

相同

X = X &Ÿ

一個 '詮釋' 與相與 '爲0xFF' 將在更高的設置所有的位3個字節歸零(一個掩碼)。

的askterisk被解除引用的指針,所以

*p 

是一個整數。

'後增量'更新實際的指針值,指向內存中的下一個整數。因此,總的來說,代碼將遍歷內存中的「長度」整數,並且屏蔽除最低字節(即'A'BGR顏色值'紅'字節)以外的所有內容。

+0

感謝您的解釋。 – 2010-08-11 08:12:24

2

這是你在C語言中發現的那種語法,在那裏皺起眉頭,但並不罕見。寫出:

int temp = *p; 
temp = temp & 0x000000ff; 
*p = temp; 
p = p + 1; // Move pointer by 4 bytes. 

它取決於位圖格式,如果這將工作得很好。通常情況下,代碼將像素的alpha值重置爲零。製作黑色圖像。

+0

感謝您的解釋。 – 2010-08-12 12:18:48