有ABC三个分类 每种分类下 又有若干种元素
需要取出ABC分类中的元素 进行组合 使组合后 得到唯一的值
比如做一个聊天页面
发送方向
发送方
接收方消息类型
文字
图片
语音
每个发送方向 对应的消息类型 有不同的显示样式 就需要先判断出是哪种组合结果 再显示对应的样式
可以用按位与“|”运算 来组合元素
每个元素在自己的位置上设置为1 其余位是0
这样能保证这个元素本身的唯一
分类
A分类
A分类下 有5种元素 2进制需要5位
00000
前面补足三个0
0000 0000
B分类
B分类下 有16种元素 2进制需要16位
0000 0000 0000 0000
C分类
C分类下 有3种元素 2进制需要3位
000
前面补足一个0
0000
位数叠加
ABC的位数叠加 A是最低阶 B是中介 C是高阶
0000 0000 0000 0000 0000 0000 0000
C B A
举例
A|B|C
A1 = 0000 0000 0000 0000 0000 0000 0001
A2 = 0000 0000 0000 0000 0000 0000 0010
A3 = 0000 0000 0000 0000 0000 0000 0100
A4 = 0000 0000 0000 0000 0000 0000 1000
A5 = 0000 0000 0000 0000 0000 0001 0000
B1 = 0000 0000 0000 0000 0001 0000 0000
B2 = 0000 0000 0000 0000 0010 0000 0000
B3 = 0000 0000 0000 0000 0100 0000 0000
C1 = 0001 0000 0000 0000 0000 0000 0000
C2 = 0010 0000 0000 0000 0000 0000 0000
C3 = 0100 0000 0000 0000 0000 0000 0000
与“|”运算结果
A1 | B3 | C3 = 0100 0000 0000 0000 0100 0000 0001
A2 | B1 | C1 = 0001 0000 0000 0000 0001 0000 0010
A5 | B2 | C2 = 0010 0000 0000 0000 0010 0001 0000
分类之间进行与运算 得到结果 每个都不相同
写成16进制
A1 = 0x0000001
A2 = 0x0000002
A3 = 0x0000004
A4 = 0x0000008
A5 = 0x0000010
B1 = 0x0000100
B2 = 0x0000200
B3 = 0x0000400
C1 = 0x1000000
C2 = 0x2000000
C3 = 0x4000000
A1 | B3 | C3 = 4000401 (十进制 67109889)
A2 | B1 | C1 = 1000102 (十进制 16777474)
A5 | B2 | C2 = 2000210 (十进制 33554960)
java 代码实现
public class TestOnlyResult {
public static void main(String[] args) {
long r1 = A.A1.toValue() | B.B3.toValue() | C.C3.toValue();
long r2 = A.A2.toValue() | B.B1.toValue() | C.C1.toValue();
long r3 = A.A5.toValue() | B.B2.toValue() | C.C2.toValue();
System.out.println("A1: " + A.A1.toValue() + " B3: " + B.B3.toValue() + " C3: " + C.C3.toValue() + " result: " + r1 + "十六进制:" + Long.toHexString(r1));
System.out.println("A2: " + A.A2.toValue() + " B1: " + B.B1.toValue() + " C1: " + C.C1.toValue() + " result: " + r2 + "十六进制:" + Long.toHexString(r2));
System.out.println("A5: " + A.A5.toValue() + " B2: " + B.B2.toValue() + " C2: " + C.C2.toValue() + " result: " + r3 + "十六进制:" + Long.toHexString(r3));
}
public enum A {
A1(0x0000001), A2(0x0000002), A3(0x0000004), A4(0x0000008), A5(0x0000010);
private long value;
A(int num) {
this.value = num;
}
public long toValue() {
return value;
}
}
public enum B {
B1(0x0000100), B2(0x0000200), B3(0x0000400);
private long value;
B(int num) {
this.value = num;
}
public long toValue() {
return value;
}
}
public enum C {
C1(0x1000000), C2(0x2000000), C3(0x4000000);
private long value;
C(int num) {
this.value = num;
}
public long toValue() {
return value;
}
}
}