二进制编程理念<一>位移法 一个数字表示多种状态

初次了解到了二进制编码的内容,在次将此项作为以后的学习内容之一,之前跟同学交流在系统资源有限的情况下如何利用有限的资源存储数据,可以利用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;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值