0

要插入该值,首先使用掩码清除与给定颜色通道对应的像素的 8 位。例如,在红色的情况下,将一个 8 位掩码向左移动 16 位,将其反转(使用 ~ 运算符),然后将此掩码与 RGB 值“与”(&),这会清除 8 位红色并保持其他位不变。接下来,将参数值(在这种情况下为红色)向左移动相同数量的位数(在红色的情况下为 16),并将移位后的值“或”(|)转换为像素值。

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

根据指示,我做错了什么?

4

2 回答 2

2

这里的问题似乎是理解赋值如何工作的一个基本问题(在 Java 中......以及几乎所有命令式编程语言!)。例如:

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

说的是:

  1. 赋值给移位 16 位red的值Pixel

  2. 分配给按位取反red的值Pixel。这会破坏red您在上一步中计算的值。

如果要否定在步骤 1 中计算的值,则需要执行以下操作:

red = ~red;
于 2013-10-07T02:10:09.543 回答
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))

result是第pixel17-24 位清零。

这是设置“红色”值的第一步(是的,还有后续步骤,如您的作业中所述)pixel

我不确定这是否是您的意图,但您开发的内容与您的问题无关:您没有设置红色值,而是似乎获得了红色值。

但是,您开发的内容仍然远非正确。例如,您应该有一个类似的掩码,第 17-24 位为 1,其他位为 0,然后 & 具有此掩码的像素,然后将剩余值(位于第 17-24 位)移动到第 0-7 位。

我不会给你真正的答案,因为这是你从中学习的工作。但是我相信我给出的提示是绰绰有余的。

于 2013-10-07T02:24:36.640 回答