要插入该值,首先使用掩码清除对应于给定颜色通道的8位像素。例如,在红色的情况下,移动一个8位掩码,剩下16位,反转它(使用〜运算符),“和”(&)这个掩码用RGB值清除8红色的位并保持其他位不变。接下来,将参数值(在这种情况下为红色)移位相同的位数(在红色的情况下为16),将“或”(|)移位的值移到像素值中。
int getRed(){
red = (Pixel>>16);
red = ~Pixel;
red = Pixel<<16 | Pixel;
return red;
}
根据指示,我做错了什么?
答案 0 :(得分:2)
这里的问题似乎是理解赋值如何工作的基本问题(在Java中......以及几乎所有命令式编程语言!)。例如:
red = (Pixel>>16);
red = ~Pixel;
那说:
分配给red
Pixel
移位16位的值
将red
的值分配给Pixel
否定。此 clobbers 您在上一步中计算的red
的值。
如果要取消在步骤1中计算的值,则需要执行以下操作:
red = ~red;
答案 1 :(得分:1)
我相信你根本不明白发生了什么。第一行已经不正确了:
它说,“在红色的情况下,将一个8位掩码移位16位,反转它(使用〜运算符),”和“(&amp;)这个掩码使用RGB值”< / p>
这意味着
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))
result
是pixel
,第17位清除。
这是第一步(是的,有后续步骤,如你的作业所述)在pixel
中设置“红色”值
我不确定这是否是你的意图,但你开发的内容与你的问题无关:不是设置红色值,而是 获得红色值。
然而,你所发展的仍然远非正确。例如你应该有一个类似的掩码,第17-24位为1,其他位为0,然后&amp;具有此掩码的像素,然后将剩余值(位于第17-24位)移位到第0-7位。
我不会给你实际的答案,因为从中学习是你的工作。但是我相信我提供的暗示绰绰有余。