如何将分类两两组合 得到唯一的值

2018-01-25  本文已影响17人  真像大白

有ABC三个分类 每种分类下 又有若干种元素
需要取出ABC分类中的元素 进行组合 使组合后 得到唯一的值

比如做一个聊天页面

  1. 发送方向
    发送方
    接收方

  2. 消息类型
    文字
    图片
    语音

每个发送方向 对应的消息类型 有不同的显示样式 就需要先判断出是哪种组合结果 再显示对应的样式

可以用按位与“|”运算 来组合元素
每个元素在自己的位置上设置为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;
        }
    }

}
上一篇下一篇

猜你喜欢

热点阅读