我试图解决一个问题,涉及基本上在输入参数之间实现逻辑AND.
问题的复杂性涉及输入参数的大小.为了给出高级概述,我试图实现类似的逻辑
100 & 100 == 100
001 & 010 == 0
001 & 100 == 0
.....
Run Code Online (Sandbox Code Playgroud)
复杂性是一些输入参数可以是400位长.它不是真正的二进制数表示.它更像是一种位置表征.相同的输入可以表示为
100 = x1; (or) x100
011 = x2,3; (or) x011
001.......11 = x3,......450,451;
Run Code Online (Sandbox Code Playgroud)
所以基本上"x"只是一个带有值的前缀.这是很久以前设计的ACL系统,我正在尝试为它实现Java版本.
我在Java中找不到可用于表示与400位一样大的二进制表示的数据类型.我也可以使用十进制表示[即.,x2,3]并解决它,但除了循环整个数字范围并将其与其他输入参数进行比较之外,我想不出办法.两个输入参数都可以归一化为相同的表示格式[即二进制或十进制].
任何建议(或)有助于我如何解决这个问题?
aio*_*obe 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);
Run Code Online (Sandbox Code Playgroud)
要解析一个x110101字符串,你可以做类似的事情
String acl = "x110101";
BitSet bs1 = new BitSet();
for (int i = 1; i < acl.length(); i++)
if (acl.charAt(i) == '1')
bs1.set(i);
Run Code Online (Sandbox Code Playgroud)
如果你仍然不喜欢这种方法,你可以使用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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
424 次 |
| 最近记录: |