代码如下:
int rgb[] = new int[] {
(argb >> 16) & 0xff, //red
(argb >> 8) & 0xff, //green
(argb ) & 0xff //blue
};
我看到一个从 INT 值获取 RGB 值的代码,操作如上,但我以前从未见过这样的操作,我想找到更多关于它们是什么以及它们能做什么的信息,符号 >> 和 &和 0xff。
那么,你们都用 Java 解决了哪些问题呢?
代码如下:
int rgb[] = new int[] {
(argb >> 16) & 0xff, //red
(argb >> 8) & 0xff, //green
(argb ) & 0xff //blue
};
我看到一个从 INT 值获取 RGB 值的代码,操作如上,但我以前从未见过这样的操作,我想找到更多关于它们是什么以及它们能做什么的信息,符号 >> 和 &和 0xff。
那么,你们都用 Java 解决了哪些问题呢?
位运算的进一步解释。让我们假设 int 位如下所示:
00000000 10101010 01010101 11011011
unused red green blue
要获得蓝色的 int 值,您需要关闭除低 8 位之外的所有位。执行此操作的简单方法是使用按位与。0xff 也可以写成 0x000000ff,将高 24 位设置为 0,只打开低 8 中已经设置为 1 的位。
argb & 0xff ==> 00000000 00000000 00000000 11011011
blue
argb >> 8 ==> 00000000 00000000 10101010 01010101
red green
(argb >> 8) & 0xff ==> 00000000 00000000 00000000 01010101
green
argb >> 16 ==> 00000000 00000000 00000000 10101010
red
(argb >> 16) & 0xff ==> 00000000 00000000 00000000 10101010
red
即使认为红色值上的 & 0xff 似乎没有必要,也不能保证调用者可能没有设置一些未使用的高位位,因此您希望安全并关闭所有这些位。
int rgb[] = new int[] {
(argb >> 16) & 0xff, //red
(argb >> 8) & 0xff, //green
(argb ) & 0xff //blue
};
>>
: 算术右移。也称为有符号移位。
&
: 按位与
0x....
: 十六进制数。
但它在做什么?
(argb >> 16) & 0xff
将 16 位的值右移argb
,然后执行按位与运算以仅捕获 8 位。这实际上是从位 16-23 获取字节