状态管理
date
May 6, 2021
slug
Status Manager
status
Published
tags
理论基础
计算机基础
碎碎念
summary
Status Manager
type
Post
在日常开发过程中,最好不要直接使用 1,2,3 这种数字作为单独的状态进行管理,最好以十位数或百位数以上的数字进行状态管理。
原因在于,1,2,3 这种状态,一旦确定,后续如果想加一个和 1 有关的状态就显得不那么友好。而用 101,201,301,104,这种就能很清晰的看出各个状态之间的关联性,这种方法也同样适用于个人资料管理的命名规范。
如果存在多个状态,且当前状态有可能是一个状态集的时候,这种方案就显得不那么美好了,比如一共有 16 个状态,当前状态集可能包含第 1 ,3,8,10 这四个状态,判断状态是否存在,移除、添加状态就显得特别的繁琐。
优化下就可以用 HashMap,或 Set 进行管理,通过这种数据结构的 Item 唯一性的特质来进行管理。
当然用 HashMap 来做还是显得有些过于繁重,更合适的,则是利用二进制的位运算进行管理。
通过利用二进制的 与、或、取反操作配合单个二进制数有且只有一位的 1,就能很好的进行状态管理,而且更便于传输和存储。
private static String toBinary(int num) {
// 4 位
int value = 1 << 16 | num;
int right = 1 >> 16 | num;
String bs = Integer.toBinaryString(value);
return " "+bs.substring(1);
}
int a = 0x0001; // 等于 b >> 1
int b = 0x0002; // 等于 a << 1
int c = 0x0004; // 等于 a << 2 等于 b << 1
System.out.println("a = 0x0001 " + a + " ,二进制 " + toBinary(a)); // 0001
System.out.println("b = 0x0002 " + b + " ,二进制 " + toBinary(b)); // 0010
System.out.println("c = 0x0004 " + c + " ,二进制 " + toBinary(c)); // 0100
// 位运算
// 与运算,二进制的每一位进行与操作,均为 1 结果才是 1
System.out.println("a & b = " + (a & b)); // 0
// 或运算,二进制的每一位进行或操作,均为 0 结果才是 0
System.out.println("a | b = " + (a | b)); // 3
// 添加状态位:用或运算 |
// 判断状态是否存在:用与运用 & 并判断结果是否为 0,0 没有此状态,有值为有此状态
// 移除状态位:用 与运算的取反,对移除的状态取反,然后和状态集进行 与运算,相当于 0111 对 0001 的反值(0000)与运算 就成了 0110
int result = a | b | c;
System.out.println("a | b | c = " + result + " " + toBinary(result)); // 7 0111
int resultB = result & b;
System.out.println("result 是否包含 b " + (resultB != 0) + " " + toBinary(resultB)); // true 0010
// 移除 b
result = result & ~b;
System.out.println("result & ~b " + result + " " + toBinary(result)); // 5 0101
resultB = result & b;
System.out.println("result 是否包含 b " + (resultB != 0) + " " + toBinary(resultB)); // false 0000