我们需要明白一点 1字节(byte) 等于8个bit 位
int 类型取1个字节
在java 中 int 类型占用 32个bit位 8个bit位等于 1个字节 所以 1个int 占用4个字节 内存分布如下图
假设现在我们要取出第3个字节的数据 那么就使用位运算 移除右边第1,2字节的数据 代码如下
Integer a = 15732480
byte b = a>>16 ; 解释为什么是右移动16 位 因为1个字节是8个bit位,两个字节刚好16bit 位,下图为红色部分为右移后的内存分布 ,原来的第4,第2个字节数据被移动到了第2,第1的位置上。
取出第3个字节 的数据
我们只需要将右移后的数据 取出低8位就是第3个字节的数据
我们需要用到与运算 (&) 关于与运算的解释可查看 与(“与”运算)_百度百科 (baidu.com)
简单理解 两位同时为“1”,结果才为“1”,否则为0
代码如下
int c= a&0xff;
完整代码
Integer a = 15732480; int b = a >> 16; int c = b & 0xff; System.out.println(c); byte b3 = (byte) (b & 0xff); System.out.println(b3);
最后c 的值是240
反向推:
把15732480 转换成 二进制 得到如下数据
00000000 11110000 00001111 00000000
第3个字节的数据是 11110000 转换成10进制 即 240 转换16进制 位F0
------------------------------------------------------------------------------------------------------
如果把一个int类型数据转成2个byte的数据 取最低的16bit位的数据即可代码如下
Integer a = 15732480; //需要移除第1个字节的数据才能取出我们需要的数据 int b = a >> 8; byte b1 = (byte) (b & 0xff); byte b2 = (byte) (a & 0xff); System.out.println(b1); System.out.println(b2);
-----------------------------------------------------------------------------------------------------------
java rgb 颜色转换
Integer a = 15732480; System.out.println(getRgb(a)); //F00F00
F00F00 即红色
/*** * 10进制转rgb * @param color * @return */ public static String getRgb(Integer color) { String red = String.format("%02X", (color >> 16) & 0xff); String green = String.format("%02X", (color >> 8) & 0xff); String blue = String.format("%02X", color & 0xff); return String.format("%s%s%s", red, green, blue); }
rgb转16进制 F0 0F 00 首先把rgb拆分成3个byte 比如 F0 10进制 240 , 0F 10进制 15, 00 10进制 0 最终进行位左移动 在合并 即可
/*** * rgb 转10 进制 * @param red * @param green * @param blue * @return */ public static Integer rgbToInteger(Integer red, Integer green, Integer blue) { return ((0xFF << 24) | (red << 16) | (green << 8) | blue); }
-----------------
数据拆分与合并 使用 | 代码如下
Integer a = 15732480; int ar = a >> 24 & 0xff; int r = a >> 16 & 0xff; int g = a >> 8 & 0xff; int b = a >> 0 & 0xff; Integer d = (ar << 24) | r << 16 | g << 8 | b; System.out.println(d);