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
就正确了