初次了解到了二进制编码的内容,在次将此项作为以后的学习内容之一,之前跟同学交流在系统资源有限的情况下如何利用有限的资源存储数据,可以利用byte来存储,而一个byte由8个bits组成,而每个bits都可以表示一种状态,在此后又看项目又了解到了利用位移法存储多种状态.
本文转载了作者CSDN的文章,链接如下:
如侵权,通知我删除
与运算(&)、或运算(|)、异或运算(^)
位运算符
首先先了解一下位运算符
一:与运算符(&) 预算规则:0&0=0;0&1=0;1&0=0;1&1=1
即:两个同时为1,结果为1,否则为0
例如:3&5
十进制3转为二进制的3:0000 0011
十进制5转为二进制的5:0000 0101
------------------------结果:0000 0001 ->转为十进制:1
即:3&5 = 1
二:或运算(|)
运算规则:
0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :参加运算的两个对象,一个为1,其值为1。
例如:3|5 即 00000011 | 0000 0101 = 00000111,因此,3|5=7。
三:异或运算符(^)
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
即:参加运算的两个对象,如果两个位为“异”(值不同),则该位结果为1,否则为0。
例如:3^5 = 0000 0011 | 0000 0101 =0000 0110,因此,3^5 = 6
业务描述
现在数据库存储数据描述一台机器,机器有两种种预警:故障,保修到期…数据库存储状态字段:
1.故障
2.保修到期
而这两种预警时可以叠加的即3:故障与保修到期,那么为什么直接存3呢?
其一:如果解决掉了一种预警的话代码方面不太好操作
其二:如果预警类型多了的情况下就业务就更加的复杂了,要多加很多的判断条件
# 场景模拟
public enum DeviceWarns {
// 1 -> 00000001
EXPIRED(1, "故障"),
// 2 -> 00000010
CARD_EXPIRED(1 << 1, "保修到期"),
// 新增 -> 位或操作 如果机器新增了一位预警状态则使用或的位运算符
// old -> 00000001 -> 故障 1
// add -> 00000010 -> 保修到期 2
// new -> 00000011 -> 故障和保修到期
<hr>
public static Integer add(Integer old, Integer add) {
return old | add;
}
// 删除 -> 位异或操作 解决掉了一项预警后
// old -> 00000011 -> 故障和保修到期 00000011==3
// del-> 00000010 -> 保修到期 2
// new -> 00000001 -> 故障 1
public static Integer remove(Integer old, Integer del) {
return old ^ del;
}
// 是否包含某种状态 -> 位与操作
public static boolean has(Integer original, Integer target) {
return target == (original & target);
}
private int code;
private String description;
private DeviceWarns(Integer code, String description) {
this.code = code;
this.description = description;
}
public String getMessage() {
return description;
}
public int getCode() {
return this.code;
}