gpt4 book ai didi

java - 在 Java 中实现按位与问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:29:40 26 4
gpt4 key购买 nike

我正在尝试解决一个基本上涉及在输入参数之间实现逻辑与的问题。

问题的复杂度涉及到输入参数的大小。为了给出一个高层次的概述,我正在尝试实现类似于

的逻辑
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 位那么大的二进制表示。我也可以使用十进制表示法 [ie., x2,3] 并解决它,但除了遍历整个数字范围并将其与其他输入参数进行比较之外,我想不出其他方法。两个输入参数都可以标准化为相同的表示格式[即二进制或十进制]。

关于如何解决这个问题有什么建议(或)帮助吗?

最佳答案

你可以使用 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);

关于java - 在 Java 中实现按位与问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4935719/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com