我想知道" Bitwise Shifting"的含义。目前我正在尝试使用BufferedImage在Java中创建图像过滤器。我找到了一些关于如何在其他帖子中单独访问RGB值的好答案,但并不确定它是如何工作的。据我所知,RGB值存储在每个8位部分的32位int中,代表值。
这就是我所看到的:a link
基本上正在寻找某人来解释这个过程,我所做的谷歌搜索过于技术化了。
答案 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