状态位
来源:互联网 发布:centos 7 1611下载 编辑:程序博客网 时间:2024/05/20 14:19
概述
业务开发中,一个对象经常有多个状态位,一个状态位表示一种状态,比如电商中的商品在618一天,既参加了满减活动A,又参加了7折活动B,是否参加活动A与是否参加活动B都是该商品的相互独立的两个状态位.一种最简单的开发就是,用两个字段分别存储A与B的状态位,但是参加活动很多时,无疑是十分不可取.这个时候就需要考虑用一个字段表示多个状态位,也就是状态位复用(专业术语不知道叫啥).
上述举例中,一种状态位只有两个值(可以称之为boolean 状态位)0与1,看见0与1就有中很熟悉的感觉,就是计算机的机器语言.
业务中状态值通常用int表示,一个int 占4个字节,32位,状态位可以从2^0-2^(32-1),足以应付一般的业务需求.
demo
package status;import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class MarkStatus {private Integer status = 0;public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status = status;}/** * 判断是否拥有此标示位的权限 * * @param markStatus * @return */public static boolean isMarkPrivilege(Integer markBit, Integer status) {if (status == null || status == 0 || status == null || status <= 0) {return false;}int power = 1 << (markBit - 1);if ((status & power) != 0) {return true;} else {return false;}}/** * 添加某个标示位的权限 * * @param markBit */public void addMarkPrivilege(Integer markBit) {if (markBit == null || markBit <= 0) {return;}if (this.status == null) {this.status = 0;}int power = 1 << (markBit - 1);this.status = this.status | power;}/** * 删除某个标示位的权限 * * @param markBit */public void deleteMarkPrivilege(Integer markBit) {if (markBit == null || markBit <= 0) {return;}if (this.status == null) {this.status = 0;}int power = 1 << (markBit - 1);this.status = this.status & (~power);}public static void main(String[] args) {/*测试三种状态,组合的情况有8种,也就是status 可以表示8种状态(0 比较特殊表示不拥有一种状态位)*/int markBitA = 1;int markBitB = 2;int markBitC = 3;/*测试0-20,分别满足标识位的列表*/List<Integer> lista = new ArrayList<>();List<Integer> listb = new ArrayList<>();List<Integer> listc = new ArrayList<>();for (int i = 0; i < 20; i++) {if (MarkStatus.isMarkPrivilege(markBitA, i)){lista.add(i);}if (MarkStatus.isMarkPrivilege(markBitB, i)){listb.add(i);}if (MarkStatus.isMarkPrivilege(markBitC, i)){listc.add(i);}}System.out.println("A : " + Arrays.toString(lista.toArray()));System.out.println("B : " + Arrays.toString(listb.toArray()));System.out.println("C : " + Arrays.toString(listc.toArray()));/*打印 * A : [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]B : [2, 3, 6, 7, 10, 11, 14, 15, 18, 19]C : [4, 5, 6, 7, 12, 13, 14, 15]*//*测试*/MarkStatus s = new MarkStatus();s.addMarkPrivilege(markBitA);System.out.println(s.getStatus());//1 在A列表中s.addMarkPrivilege(markBitB);System.out.println(s.getStatus());//3在A,B列表中s.addMarkPrivilege(markBitC);System.out.println(s.getStatus());//7在A,B,C列表中}}
阅读全文
1 0
- 状态位
- 状态位
- 位操作状态码
- 位运算状态压缩
- 状态控制标志位
- 关于状态位的总结
- hdu1429位运算状态压缩
- POJ1143位操作+状态压缩
- 位运算(状态压缩)
- hdu 3935 -枚举+位运算表示状态和状态转移
- MS Sql索引建立---(状态位或标示位)
- Java 位运算系列之通过位运算操作状态
- “状态位”虽小,却有学问
- 对象属性(状态等)位控制方法
- 检测单个位状态的技巧
- zoj 2297【DP+位运算状态压缩】
- POJ 3925 - 状态DP.位运算
- 利用位操作来进行状态操作
- tensorflow中optimizer如何实现神经网络的权重,偏移等系数的更新和梯度计算
- 廖雪峰JS教程课后习题及答案--自创
- Java中关于String类型的10个问题
- 关于使用gulp-rev的疑惑
- 查看RHEL网卡绑定模式和绑定状态
- 状态位
- 【怎样写代码】确保对象的唯一性 -- 单例模式(四):饿汉式单例类与懒汉式单例类的讨论
- 设置Activity无标题栏
- Android 获取APK编译时间
- HDU 5832A water problem 简单模拟
- listagg函数将查询列转为行
- 类文件结构
- POJ-2528Mayor's posters(离散+线段树区间覆盖)
- URL(字符串)