我读了“C.Sharp 3.0 in a Nutshell”一书,并且遇到了我感兴趣的下一段代码。
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 ++&amp; = 0xFF”是如何工作的?
答案 0 :(得分:9)
该功能可能是为了获取位图图像,并过滤掉除红色以外的所有颜色。
这假定它是一个32位位图,其中每个像素由int
表示。
您取消引用p
当前指向的内存位置(int
),并将其与0xFF
进行AND运算,这实际上只留下像素的红色分量(假设最低的字节是红色组件)。您还会自动将指针递增到下一个int
(++
)。那回答了吗?
答案 1 :(得分:6)
它与此相同(IMO原始的*p++ &= 0xFF;
技巧有点令人讨厌 - 它是一行代码,它做了两件事):
*p = *p & 0xFF;
p++;
像a = a & 0xFF
这样的表达式将变量a
的最后8位设置为零。
答案 2 :(得分:2)
这是你在C语言中找到的那种语法,在那里也不赞同但并不罕见。写出来:
int temp = *p;
temp = temp & 0x000000ff;
*p = temp;
p = p + 1; // Move pointer by 4 bytes.
这取决于位图格式,如果这将很好。不常见的是,代码将像素的alpha重置为零。制作黑色图像。
答案 3 :(得分:1)
此代码递增指针p,使其指向位图中的下一个像素,然后屏蔽除最低有效字节之外的所有字节,以Microsoft BMP格式(我假设在其他非标准实现中)为BGR格式。
这具有去除除红色之外的所有颜色成分的效果。
答案 4 :(得分:1)
你可能知道,
x &= y
与
相同x = x&amp; ÿ
'int'以'0xff'结尾,将高3字节的所有位设置为零(掩码)。
askterisk正在取消引用指针,所以
*p
是一个整数。
'post increment'更新实际指针值以指向内存中的下一个整数。
总而言之,代码将在内存中运行'length'整数,并屏蔽除最低字节之外的所有字节(即,如果这些是[A] BGR颜色值,则为'红色'字节)。