二进制数据 拆分与合成 中运用的位运算操作


title: 二进制数据 拆分与合成 中运用的位运算操作

二进制编码

像素值:RGB(0,0,0)

·图片是由像素点组成的矩阵,每个像素点可以表达一种颜色(一个颜色方块)

像素值即为像素的颜色值

·其中 R(红色)G(绿色)B(蓝色)对应三原色,每个颜色有自己的值,范围为 0~255,即一个字节
·黑色:0,0,0
·白色:255,255,255

二进制

定义

以 2 为基数,用 1/0 表示数,一位为 1bit,其中 1byte=8bit,1int=4 byte=32bit

与其他进制的转换(以像素值转换为例)

·对像素值(130,30,89)这三个数是十进制结果,因为每个数范围为 0~255,故为每个颜色分配 8 个 bit
则 Red:130:1000 0010 Green:30:0010 1000 Blue:89: 0101 1001
·如果将 RGB 存为一个 int 类型则会显示
0000 0000 1000 0010 0010 1000 0101 1001
·即将 int 的后三个 byte 拆开让 RGB 安顺序存入,形成一个新的 int 型数

二进制运算

运算符(基于二进制数值进行的)

移位运算符:>>,<<,>>>

·>>:向右移动二进制编码
·>>>:无符号右移二进制编码
·<<:向左移动二进制编码
####位运算符
·“非 ”运算(~):单目运算符,对一个数进行运算,将该数按位取反
·“与”运算(&):相同保留源码,不同取 0
·”异或“运算(^):对两个数,每位相同的取 0,不同的取 1
·“或”运算(|):有 1 就取 1,只有在同为 0 时取 0

格式

除~外:数字/变量 符号 数字/变量
~:~数字/变量

十六进制运算

·以 16 为基数,有 0 1 2 3 4 5 6 7 8 9 A B C D E F 为 符号
·十六进制于 二进制转换遵循“四对 一”,即一位十六进制数转换为四位二进制数,四位二进制数合成为一位十六进制数

二进制数据的拆分与合成(以从 RGB值中取出红绿蓝和合成为例)

拆分

如果有一个 int RGB=4860649 要取出分别的值
(4860649=0000 0000-1001 0100-0101 0101-1101 0010)
如果直接用移位进行取出

public class RGB {
    public static void main(String[] args) {
        int RGB=4860649;
        int red=RGB>>16;
        int green=RGB>>8;
        int blue=RGB;
        System.out.println("红色:"+red);
        System.out.println("绿色:"+green);
        System.out.println("蓝色:"+blue);
    }
}

则输出的结果为
在这里插入图片描述

这里只有红色值是对的
这是因为绿色蓝色在移位时,前面的数字没有消去,
这里需要用到与运算,在移位后只保留后 8位进行输出

public class RGB {
    public static void main(String[] args) {
        int RGB=4860649;
        int red=(RGB>>16)&255;
        int green=(RGB>>8)&255;
        int blue=RGB&255;
        System.out.println("红色:"+red);
        System.out.println("绿色:"+green);
        System.out.println("蓝色:"+blue);
    }
}

这时输出的结果为
在这里插入图片描述

这就是正确的结果了

合成

合成是在知晓分别值的情况下,将三个值合为一个值
这里比较简单,只需要用到左移运算符
但是要注意运算符优先级造成的运算错误

int rgb=red<<16+green<<8+blue;
System.out.println(rgb);

输出的结果为 0
就是错误的,
在我们不了解优先级的情况下可以用括号的方式让我们想优先计算的式子优先计算
int rgb=(red<<16)+(green<<8)+blue;
输出结果为4860649
就正确了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值