如何在 Java 中将二进制字符串转换为以 10 为底的整数
Posted
技术标签:
【中文标题】如何在 Java 中将二进制字符串转换为以 10 为底的整数【英文标题】:How to convert a Binary String to a base 10 integer in Java 【发布时间】:2012-04-28 01:40:06 【问题描述】:我有一个表示二进制数(不带前导零)的字符串数组,我想将其转换为相应的以 10 为基数的数字。考虑:
binary 1011 becomes integer 11
binary 1001 becomes integer 9
binary 11 becomes integer 3 etc.
最好的方法是什么?我一直在探索 java.lang.number.* 却没有找到直接的转换方法。 Integer.parseInt(b)
产生一个与字符串相等的整数...例如,1001 变为 1,001 而不是 9...并且似乎不包含输出基数的参数。 toBinaryString
转换方向错误。我怀疑我需要进行多步转换,但似乎找不到正确的方法或子类组合。我也不确定前导零或缺少前导零会在多大程度上成为问题。有人有什么好的方向可以指点我吗?
【问题讨论】:
看Integer#parseInt(String s, int radix) converting Binary Numbers in to decimal numbers的可能重复 【参考方案1】:您需要specify the radix。 Integer#parseInt()
的重载允许您这样做。
int foo = Integer.parseInt("1001", 2);
【讨论】:
完美。我完全错过了允许基数的 parseInt 文档的第二行。像梦一样工作。 这是否也适用于前导零?只是确认一下,虽然我看不出为什么不这样做。 @NagabhushanBaddi 例子?您是否传递二进制补码表示?【参考方案2】:这可能有效:
public int binaryToInteger(String binary)
char[] numbers = binary.toCharArray();
int result = 0;
for(int i=numbers.length - 1; i>=0; i--)
if(numbers[i]=='1')
result += Math.pow(2, (numbers.length-i - 1));
return result;
【讨论】:
我想这有点不必要。当你在课间有一点时间时,就会发生这种情况。 这个对我很有帮助,因为我必须在不使用 java 已有的转换的情况下做一个学校项目 以前有人测试过吗?这里 number.length 减去索引加 1 被乘以 2,如果我没记错的话,你从 1 开始并将该值乘以 2,然后获取结果并将其乘以 2,这将是你的第 3 位等等上 (评论框不适合片段)这是我在你的代码中使用的代码(我迷路了,用你的作为模板) public static int binaryToInteger(String binary) char[]数字 = binary.ToCharArray();整数结果 = 0; int posValue = 1; for (int i = numbers.Length - 1; i >= 0 ; i--) if (numbers[i] == '1') result += posValue; posValue *= 2; 返回结果; 此代码 sn-p 不起作用。for
循环和新 result
变量的计算不正确。【参考方案3】:
int foo = Integer.parseInt("1001", 2);
如果您正在处理正数,则效果很好,但如果您需要处理带符号的数字,您可能需要签署扩展您的字符串,然后转换为 Int
public class bit_fun
public static void main(String[] args)
int x= (int)Long.parseLong("FFFFFFFF", 16);
System.out.println("x =" +x);
System.out.println(signExtend("1"));
x= (int)Long.parseLong(signExtend("1"), 2);
System.out.println("x =" +x);
System.out.println(signExtend("0"));
x= (int)Long.parseLong(signExtend("0"), 2);
System.out.println("x =" +x);
System.out.println(signExtend("1000"));
x= (int)Long.parseLong(signExtend("1000"), 2);
System.out.println("x =" +x);
System.out.println(signExtend("01000"));
x= (int)Long.parseLong(signExtend("01000"), 2);
System.out.println("x =" +x);
private static String signExtend(String str)
//TODO add bounds checking
int n=32-str.length();
char[] sign_ext = new char[n];
Arrays.fill(sign_ext, str.charAt(0));
return new String(sign_ext)+str;
output:
x =-1
11111111111111111111111111111111
x =-1
00000000000000000000000000000000
x =0
11111111111111111111111111111000
x =-8
00000000000000000000000000001000
x =8
希望对你有帮助!
【讨论】:
我需要将 -1 从二进制转换为十进制,我这样做了。 System.out.println((int)Long.parseLong("11111111111111111111111111111111",2));【参考方案4】:static int binaryToInt (String binary)
char []cA = binary.toCharArray();
int result = 0;
for (int i = cA.length-1;i>=0;i--)
//111 , length = 3, i = 2, 2^(3-3) + 2^(3-2)
// 0 1
if(cA[i]=='1') result+=Math.pow(2, cA.length-i-1);
return result;
【讨论】:
【参考方案5】:public Integer binaryToInteger(String binary)
char[] numbers = binary.toCharArray();
Integer result = 0;
int count = 0;
for(int i=numbers.length-1;i>=0;i--)
if(numbers[i]=='1')result+=(int)Math.pow(2, count);
count++;
return result;
我想我更无聊了!修改了 Hassan 的答案以正确运行。
【讨论】:
【参考方案6】:对我来说,我在尝试处理负数时遇到了 NumberFormatException。我将以下用于负数和正数。
System.out.println(Integer.parseUnsignedInt("11111111111111111111111111110111", 2));
Output : -9
【讨论】:
【参考方案7】:使用 bitshift 比Math.pow
更优雅、更快捷。只需将数字(0 或 1)移位到 val <<= 1
的位置
// parse an unsigned binary string, valid up to 31 bits
static int binaryToBase10(String binaryString)
int val = 0;
for (char c : binaryString.toCharArray())
val <<= 1;
val += c-'0';
return val;
使用示例
int val = binaryToBase10("1011");
System.out.println(val);
打印 11
【讨论】:
【参考方案8】:修复了 Java 的 Integer.parseInt(text) 版本以处理负数:
public static int parseInt(String binary)
if (binary.length() < Integer.SIZE) return Integer.parseInt(binary, 2);
int result = 0;
byte[] bytes = binary.getBytes();
for (int i = 0; i < bytes.length; i++)
if (bytes[i] == 49)
result = result | (1 << (bytes.length - 1 - i));
return result;
【讨论】:
【参考方案9】:我喜欢循环!耶!
String myString = "1001001"; //73
使用累加器循环时,从左到右(l
不变):
int n = 0,
j = -1,
l = myString.length();
while (++j < l) n = (n << 1) + (myString.charAt(j) == '0' ? 0 : 1);
return n;
从右到左有 2 个循环变量,灵感来自 Convert boolean to int in Java(绝对可怕):
int n = 0,
j = myString.length,
i = 1;
while (j-- != 0) n -= (i = i << 1) * new Boolean(myString.charAt(j) == '0').compareTo(true);
return n >> 1;
一个更合理的实现:
int n = 0,
j = myString.length(),
i = 1;
while (j-- != 0) n += (i = i << 1) * (myString.charAt(j) == '0' ? 0 : 1);
return n >> 1;
可读版本:p
int n = 0;
for (int j = 0; j < myString.length(); j++)
n *= 2;
n += myString.charAt(j) == '0' ? 0 : 1;
return n;
【讨论】:
【参考方案10】:现在你想做从二进制字符串到十进制但后记,你可能需要相反的方法。它在下面。
public static String decimalToBinaryString(int value)
String str = "";
while(value > 0)
if(value % 2 == 1)
str = "1"+str;
else
str = "0"+str;
value /= 2;
return str;
【讨论】:
【参考方案11】:如果给定的是字符串,也可以使用此方法将二进制转换为十进制整数。(Java语言)
static int binaryTodecimal(String s)
int i= -1;
char[] str = s.toCharArray();
int dec_val= 0;
for (int j=str.length-1; j>=0 ;j-- )
int k= Integer.valueOf(str[j]) - '0';
i = i+1;
dec_val += k*(Math.pow(2, i));
System.out.println(dec_val);
【讨论】:
【参考方案12】:如果您担心性能,Integer.parseInt()
和 Math.pow()
太贵了。您可以使用位操作以两倍的速度执行相同的操作(根据我的经验):
final int num = 87;
String biStr = Integer.toBinaryString(num);
System.out.println(" Input Number: " + num + " toBinary "+ biStr);
int dec = binaryStringToDecimal(biStr);
System.out.println("Output Number: " + dec + " toBinary "+Integer.toBinaryString(dec));
在哪里
int binaryStringToDecimal(String biString)
int n = biString.length();
int decimal = 0;
for (int d = 0; d < n; d++)
// append a bit=0 (i.e. shift left)
decimal = decimal << 1;
// if biStr[d] is 1, flip last added bit=0 to 1
if (biString.charAt(d) == '1')
decimal = decimal | 1; // e.g. dec = 110 | (00)1 = 111
return decimal;
输出:
Input Number: 87 toBinary 1010111
Output Number: 87 toBinary 1010111
【讨论】:
以上是关于如何在 Java 中将二进制字符串转换为以 10 为底的整数的主要内容,如果未能解决你的问题,请参考以下文章