美文网首页
如何将分类两两组合 得到唯一的值

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

作者: 真像大白 | 来源:发表于2018-01-25 21:11 被阅读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;
            }
        }
    
    }
    

    相关文章

      网友评论

          本文标题:如何将分类两两组合 得到唯一的值

          本文链接:https://www.haomeiwen.com/subject/ltjbaxtx.html