Java 拆分 BitSet
Java split the BitSet
我想将一个位集拆分更多块。拆分函数取决于 bitset 的基数,即设置为 true 的位数。
例如,我有这个基数为 4 的 BitSet:
INPUT: 101101
所需的输出如下:
OUTPUT: 100000 - 001000 - 000100 - 000001
使用名为 BitSet 的 Java 库是否有实现该功能或可能的方法?
是的。使用基本操作 AND.
基本上:
xxxxxx AND 110000 = xx0000.
对所有子序列重复该过程。
这里需要一些循环:
你应该找到 1 的位置然后你可以像这样循环 :
then 如果该位置存在于列表中则打印 1 否则打印 0
public static void main(String[] args) {
String Input = "101101";
//find positions
List<Integer> listPositivePosition = new ArrayList<>();
for(int i = 0; i<Input.length(); i++){
if(Input.charAt(i)=='1'){
listPositivePosition.add(i);
}
}
for(int i = 0; i<listPositivePosition.size(); i++){
for(int j = 0; j<Input.length(); j++){
//If the position exist in the List then print 1 else print 0
if(j == listPositivePosition.get(i)){
System.out.print("1");
}else{
System.out.print("0");
}
}
System.out.println();
}
}
希望对您有所帮助。
以下代码应用每个可能的掩码,并仅保留 non-zero 结果:
int[] split(int input) {
return IntStream.iterate(Integer.reverse(1), mask -> mask >>> 1)
.limit(Integer.SIZE)
.map(mask -> input & mask)
.filter(result -> result != 0)
.toArray();
}
请原谅我的方法命名规则:)
public static void main(String[] args) {
final String a = "100100";
System.out.println(Arrays.toString(foo(a)));
}
private static String[] foo(String a) {
final long counted = IntStream.range(0, a.length()).filter(i -> a.charAt(i) == '1').count();
final String[] ret = new String[(int) counted];
int index = 0;
for (int i = 0; i < a.length(); i++) {
if (a.charAt(i) == '1') {
ret[index] = ret(a, i);
index++;
}
}
return ret;
}
private static String ret(String a, int i) {
final StringBuilder sb = new StringBuilder(a.replaceAll(".", "0"));
sb.setCharAt(i, '1');
a = sb.toString();
return a;
}
纯Java和easy-to-read解决方案:
List<String> binSplitter(String input) {
String str = new String(new char[input.length()]).replace("[=10=]", "0");
List<String> chunks = new ArrayList<>();
for (int i = 0; i < input.length(); i++) {
if (input.charAt(i) == '1') {
chunks.add(str.substring(0, i) + "1" + str.substring(i + 1, input.length()));
}
}
return chunks;
}
我想将一个位集拆分更多块。拆分函数取决于 bitset 的基数,即设置为 true 的位数。 例如,我有这个基数为 4 的 BitSet:
INPUT: 101101
所需的输出如下:
OUTPUT: 100000 - 001000 - 000100 - 000001
使用名为 BitSet 的 Java 库是否有实现该功能或可能的方法?
是的。使用基本操作 AND.
基本上:
xxxxxx AND 110000 = xx0000.
对所有子序列重复该过程。
这里需要一些循环:
你应该找到 1 的位置然后你可以像这样循环 :
then 如果该位置存在于列表中则打印 1 否则打印 0
public static void main(String[] args) {
String Input = "101101";
//find positions
List<Integer> listPositivePosition = new ArrayList<>();
for(int i = 0; i<Input.length(); i++){
if(Input.charAt(i)=='1'){
listPositivePosition.add(i);
}
}
for(int i = 0; i<listPositivePosition.size(); i++){
for(int j = 0; j<Input.length(); j++){
//If the position exist in the List then print 1 else print 0
if(j == listPositivePosition.get(i)){
System.out.print("1");
}else{
System.out.print("0");
}
}
System.out.println();
}
}
希望对您有所帮助。
以下代码应用每个可能的掩码,并仅保留 non-zero 结果:
int[] split(int input) {
return IntStream.iterate(Integer.reverse(1), mask -> mask >>> 1)
.limit(Integer.SIZE)
.map(mask -> input & mask)
.filter(result -> result != 0)
.toArray();
}
请原谅我的方法命名规则:)
public static void main(String[] args) {
final String a = "100100";
System.out.println(Arrays.toString(foo(a)));
}
private static String[] foo(String a) {
final long counted = IntStream.range(0, a.length()).filter(i -> a.charAt(i) == '1').count();
final String[] ret = new String[(int) counted];
int index = 0;
for (int i = 0; i < a.length(); i++) {
if (a.charAt(i) == '1') {
ret[index] = ret(a, i);
index++;
}
}
return ret;
}
private static String ret(String a, int i) {
final StringBuilder sb = new StringBuilder(a.replaceAll(".", "0"));
sb.setCharAt(i, '1');
a = sb.toString();
return a;
}
纯Java和easy-to-read解决方案:
List<String> binSplitter(String input) {
String str = new String(new char[input.length()]).replace("[=10=]", "0");
List<String> chunks = new ArrayList<>();
for (int i = 0; i < input.length(); i++) {
if (input.charAt(i) == '1') {
chunks.add(str.substring(0, i) + "1" + str.substring(i + 1, input.length()));
}
}
return chunks;
}