解释在Java中按位移位aRGB值

时间:2011-12-08 19:01:38

标签: java

我想知道" Bitwise Shifting"的含义。目前我正在尝试使用BufferedImage在Java中创建图像过滤器。我找到了一些关于如何在其他帖子中单独访问RGB值的好答案,但并不确定它是如何工作的。据我所知,RGB值存储在每个8位部分的32位int中,代表值。

这就是我所看到的:a link

基本上正在寻找某人来解释这个过程,我所做的谷歌搜索过于技术化了。

4 个答案:

答案 0 :(得分:2)

属于技术性质。您存储值0 - 255,或二进制:

from
00000000
to
11111111

然后你拿一个像这样的大容器:

0000000000000000

并将其插入那里,如果你的颜色是117

0000000001110101

并将其移至左侧一个字节,以便

0111010100000000

然后你添加第二种颜色,比如65或01000001并获得

0111010101000001

然后你再次向左移一个字节并获得

011101010100000100000000

最后你添加了第三种颜色,例如你得到的颜色是255或11111111

011101010100000111111111

所以你通过bitshift存储了三个值0 - 255。

答案 1 :(得分:2)

如果您有一个包含多个字节信息的整数,则屏蔽和移位是用于访问各个部分的过程。假设这些字节是这样存储的(它们可能不是,但是......)那么你就可以检索它们了:

aRGB: 255, 65, 33, 17
binary: 11111111 01000001 00100001 00010001

从变量x:

中检索红色值(65)
x && 0x00FF0000

  11111111 01000001 00100001 00010001
* 00000000 11111111 00000000 00000000
-------------------------------------
  00000000 01000001 00000000 00000000

然后进行移位操作,将位移到有意义的位置作为唯一值:

00000000 01000001 00000000 00000000 >> 16 = 00000000 00000000 00000000 01000001

二进制掩码通过将所有其他位设置为0来仅捕获值的第二个字节;只有与第二个字节匹配的位保持不变(乘以1,而不是0)。然后,将位移到右边16位,去除那些额外的0。显然,前导0不再重要,因此结果只是一个普通的二进制01000001或十进制65.

答案 2 :(得分:0)

按位运算是对数据的二进制表示的位的操作,而不是表示为整数或浮点数的数据。例如,8可以用二进制表示为1000。将其向右移动两次将所有数字向右移动3,用0填充,导致0010或2。

有关详情,请参阅Wikipedia article

答案 3 :(得分:0)

考虑内存中的位模式有多种方法。通常,我们将存储在整数中的位视为表示单个数字。高阶位比低阶位贡献更大的值,它们的值相加得到一个数字,所以采用以下模式:

00001101 00110000 00000111

将被解释为:

2^0 + 2^1 + 2^3 + 2^13 + 2^14 + 2^15 + 2^17 + 2^18 = 864,263

但我们可以自由地将这种模式视为三个 8位数字的个体组(每个都代表一个颜色组件的数值)。但是,要将高阶位中的位模式转换为我们打算表示的数字,我们需要将这些位解释为它们出现在最右边的8位组中。这就是我们转变的原因。

例如,要获取最左边的8位组的值,我们需要屏蔽不在该组中的所有位,然后将这些位向右移动16位,以便它们占据最右边的位置:

// first, assume n = 00001101 00110000 00000111
(n & 0xFF0000) >> 16 // red

零自动移入空位,留下:

00000000 00000000 00001101

我们现在可以解释为:

13

同样,我们可以计算中心和最右边组中的位值:

(n & 0x00FF00) >> 8 // green
n & 0x0000FF // blue (no shift necessary)

设置其中一个组件的值需要向另一个方向移动。例如,以下将75移至中心8位位置:

n = (n & (0xFF00FF)) | (75 << 8) 

我们首先重置绿色值(使用0xFF00FF掩码),然后将数字75向左移8位。最后,我们将这两个数字结合起来。

我们可以看到,这可以通过将其再次移出来起作用:

(n & 0x00FF00) >> 8 // => 75

重置或最大化其中一个组件甚至更简单。正如我们在前面的例子中看到的那样,对组件进行清零可以这样做:

n = n & 0xFF00FF // clear out green

另一方面,以下掩码最大化绿色组件的值:

n = n | 0x00FF00