字符串转二进制?
String to binary?
我的情况很奇怪,
我正在为另一个程序编写一个过滤器引擎,那个程序有所谓的 "save areas"。每个保存区域都编号为 0 到 32(为什么有 33 个,我不知道)。它们通过二进制字符串打开或关闭,
1 = save area 0 on
10 = save area 1 on, save area 0 off
100 = save area 2 on, save areas 1 and 0 off.
等等。
我有另一个程序传递它需要的保存区域,但它使用十进制表示和下划线 - 1_2_3 例如保存区域 1、2 和 3。
我需要将该示例转换为 1110。
我想到的是我可以构建一个字符串,如下所示:
我将它分解(使用拆分)到 savePart[i]。然后我遍历 savePart[i] 并构建 strings:
String saveString = padRight("0b1",Integer.parseInt(savePart[i]));
例如,在保存区域 6 的情况下,这将给我一个字符串,该字符串显示为“0b1000000”。
有没有办法读取该字符串,就好像它是一个二进制数一样。因为如果我说:
long saveBinary = 0b1000000L
完全可以。
或者,有没有更聪明的方法来做到这一点?
long saveBinary = Long.parseLong(saveString, 2);
请注意,您必须去掉 0b
前缀。
这样做就可以了:
String input = "1_2_3";
long areaBits = 0;
for (String numTxt : input.split("_")) {
areaBits |= 1L << Integer.parseInt(numTxt);
}
System.out.printf("\"%s\" -> %d (decimal) = %<x (hex) = %s (binary)%n",
input, areaBits, Long.toBinaryString(areaBits));
输出:
"1_2_3" -> 14 (decimal) = e (hex) = 1110 (binary)
只需取字符串中的每个数字并将其视为指数。累加找到的每个指数的总数,您将得到答案 w/o 需要删除前缀或后缀。
// will contain our answer
long answer = 0;
String[] buckets = givenData.split("_"); // array of each bucket wanted, exponents
for (int x = 0; x < buckets.length; x++){ // iterate through all exponents found
long tmpLong = Long.parseLong(buckets[x]); // get the exponent
answer = (10^tmpLong) + answer; // add 10^exponent to our running total
}
answer 现在将以 1011010101(你有什么)的格式包含我们的答案。
在您的示例中,给定的数据是 1_2_3。该数组将包含 {"1", "2", "3"}
我们遍历该数组...
10^1 + 10^2 + 10^3 = 10 + 100 + 1000 = 1110
我相信这也是您的数字为 0 - 32 的原因。x^0 = 1,因此当输入中有 0 时,您可以转储到 0 桶中。
我的情况很奇怪,
我正在为另一个程序编写一个过滤器引擎,那个程序有所谓的 "save areas"。每个保存区域都编号为 0 到 32(为什么有 33 个,我不知道)。它们通过二进制字符串打开或关闭,
1 = save area 0 on
10 = save area 1 on, save area 0 off
100 = save area 2 on, save areas 1 and 0 off.
等等。
我有另一个程序传递它需要的保存区域,但它使用十进制表示和下划线 - 1_2_3 例如保存区域 1、2 和 3。
我需要将该示例转换为 1110。
我想到的是我可以构建一个字符串,如下所示: 我将它分解(使用拆分)到 savePart[i]。然后我遍历 savePart[i] 并构建 strings:
String saveString = padRight("0b1",Integer.parseInt(savePart[i]));
例如,在保存区域 6 的情况下,这将给我一个字符串,该字符串显示为“0b1000000”。
有没有办法读取该字符串,就好像它是一个二进制数一样。因为如果我说:
long saveBinary = 0b1000000L
完全可以。
或者,有没有更聪明的方法来做到这一点?
long saveBinary = Long.parseLong(saveString, 2);
请注意,您必须去掉 0b
前缀。
这样做就可以了:
String input = "1_2_3";
long areaBits = 0;
for (String numTxt : input.split("_")) {
areaBits |= 1L << Integer.parseInt(numTxt);
}
System.out.printf("\"%s\" -> %d (decimal) = %<x (hex) = %s (binary)%n",
input, areaBits, Long.toBinaryString(areaBits));
输出:
"1_2_3" -> 14 (decimal) = e (hex) = 1110 (binary)
只需取字符串中的每个数字并将其视为指数。累加找到的每个指数的总数,您将得到答案 w/o 需要删除前缀或后缀。
// will contain our answer
long answer = 0;
String[] buckets = givenData.split("_"); // array of each bucket wanted, exponents
for (int x = 0; x < buckets.length; x++){ // iterate through all exponents found
long tmpLong = Long.parseLong(buckets[x]); // get the exponent
answer = (10^tmpLong) + answer; // add 10^exponent to our running total
}
answer 现在将以 1011010101(你有什么)的格式包含我们的答案。
在您的示例中,给定的数据是 1_2_3。该数组将包含 {"1", "2", "3"}
我们遍历该数组...
10^1 + 10^2 + 10^3 = 10 + 100 + 1000 = 1110
我相信这也是您的数字为 0 - 32 的原因。x^0 = 1,因此当输入中有 0 时,您可以转储到 0 桶中。