java 位运算

我们需要明白一点 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);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值