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

有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;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值