在Java中实现按位AND问题的问题

时间:2011-02-08 16:41:08

标签: java

我正在尝试解决一个基本上在输入参数之间实现逻辑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]并解决它,但除了循环整个数字范围并将其与其他输入参数进行比较之外,我想不出办法。两个输入参数都可以归一化为相同的表示格式[即二进制或十进制]。

任何建议(或)有助于我如何解决这个问题?

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也应该有效:

  • new BigInteger(binaryString,2)应正确解析输入
  • BigInteger实现“和”
  • 使用testBit(n)访问位