换位java

时间:2013-10-07 01:41:59

标签: java bit-manipulation

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

那说:

  1. 分配给red Pixel移位16位的值

  2. red的值分配给Pixel否定。此 clobbers 您在上一步中计算的red的值。

  3. 如果要取消在步骤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))

resultpixel,第17位清除。

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

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

然而,你所发展的仍然远非正确。例如你应该有一个类似的掩码,第17-24位为1,其他位为0,然后&amp;具有此掩码的像素,然后将剩余值(位于第17-24位)移位到第0-7位。

我不会给你实际的答案,因为从中学习是你的工作。但是我相信我提供的暗示绰绰有余。