我正在尝试解决一个基本上在输入参数之间实现逻辑AND的问题。
问题的复杂性涉及输入参数的大小。为了给出高级概述,我试图实现类似于
的逻辑100 & 100 == 100
001 & 010 == 0
001 & 100 == 0
.....
复杂性是一些输入参数可以是400位长。它不是真正的二进制数表示。它更像是一种位置表征。相同的输入可以表示为
100 = x1; (or) x100
011 = x2,3; (or) x011
001.......11 = x3,......450,451;
所以基本上“x”只是一个带有值的前缀。这是很久以前设计的ACL系统,我正在尝试为它实现Java版本。
我在Java中找不到可用于表示与400位一样大的二进制表示的数据类型。我也可以使用十进制表示[即。,x2,3]并解决它,但除了循环整个数字范围并将其与其他输入参数进行比较之外,我想不出办法。两个输入参数都可以归一化为相同的表示格式[即二进制或十进制]。
任何建议(或)有助于我如何解决这个问题?
答案 0 :(得分:18)
您可以使用BitSet
。它支持按位和操作,应该可以很好地处理400位。
以下是一个例子:
BitSet bs1 = new BitSet();
bs1.set(2);
bs1.set(5);
bs1.set(7);
bs1.set(8);
BitSet bs2 = new BitSet();
bs2.set(2);
bs2.set(7);
bs2.set(9);
bs1.and(bs2);
// Prints {2, 7}
System.out.println(bs1);
要解析x110101
字符串,您可以执行类似
String acl = "x110101";
BitSet bs1 = new BitSet();
for (int i = 1; i < acl.length(); i++)
if (acl.charAt(i) == '1')
bs1.set(i);
如果您仍然不喜欢这种方法,可以使用包含其中一些内容的Set<Integer>
。要找出两个这样的集之间的“和”,你只需set1.retainAll(set2)
。
以下是一个例子:
Set<Integer> bs1 = new HashSet<Integer>();
bs1.add(2);
bs1.add(5);
bs1.add(7);
bs1.add(8);
Set<Integer> bs2 = new HashSet<Integer>();
bs2.add(2);
bs2.add(7);
bs2.add(9);
bs1.retainAll(bs2);
// Prints [2, 7]
System.out.println(bs1);
答案 1 :(得分:4)
答案 2 :(得分:1)
BigInteger也应该有效: