Javaでバイナリ文字列をベース10整数に変換する方法


108

対応する10進数に変換する2進数(先行ゼロなし)を表す文字列の配列があります。検討してください:

binary 1011 becomes integer 11
binary 1001 becomes integer 9
binary   11 becomes integer 3   etc. 

続行するには最良の方法は何ですか?私は直接変換方法を見つけることなくjava.lang.number。*を調査してきました。Integer.parseInt(b)文字列に対して整数EQUALを生成します。たとえば、1001は9ではなく1,001になり、出力ベースのパラメータが含まれていないようです。toBinaryString間違った方向に変換します。多段階の変換を行う必要があると思いますが、メソッドまたはサブクラスの正しい組み合わせを見つけることができないようです。また、先行ゼロまたはその欠如がどの程度問題になるかはわかりません。誰かが私を指す良い方向を持っていますか?



回答:


263

基数指定する必要がありますInteger#parseInt()あなたができる過負荷があります。

int foo = Integer.parseInt("1001", 2);

1
完璧。基数を許可するparseIntドキュメントの2行目を完全に逃しました。夢のように機能します。
dwwilson66 2012

1
これは先行ゼロでも機能しますか?確認するだけです。理由はわかりません。
シッダールタ

@NagabhushanBaddiの例?2の補数表現を渡しますか?
マットボール

18

これはうまくいくかもしれません:

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;
}

必要ないかな。クラス間の時間が少しあれば、それが起こります。
Hassan

6
これは私にとって役に立ちます。なぜなら、Javaがすでに持っているものを使用せずに変換を伴う学校プロジェクトを行わなければならないからです
bucksnort2

誰かが以前にこれをテストしましたか?ここで、number.lengthからindexに1を引いた値に2を掛けています。もし、私が連番で間違っていなければ、1から始めて、その値に2を掛けて、結果を取得し、その1に2を掛けて、3位になります。オン
Christopher Cabezudo Rodriguez 2015

(コメントボックスはスニペットには適していません)ここで、私があなたのベースを使用しているコード(私は失われ、テンプレートとして使用しました)public static int binaryToInteger(String binary){char [] numbers = binary.ToCharArray(); int結果= 0; int posValue = 1; for(int i = numbers.Length-1; i> = 0; i--){if(numbers [i] == '1'){result + = posValue; } posValue * = 2; }結果を返します。}
クリストファーカベズドロドリゲス2015

1
このコードスニペットは機能していません。forループと新しいresult変数の計算が正しくありません。
trylimits

8
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
2進数から10進数に変換する-1が必要でした。これを行いました。System.out.println((int)Long.parseLong( "11111111111111111111111111111111"、2));
Zeus

5
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;
}

2
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の回答が正しく機能するように変更されました。


1

私にとって、負の数を処理しようとするとNumberFormatExceptionが発生しました。負の数と正の数には次のものを使用しました。

System.out.println(Integer.parseUnsignedInt("11111111111111111111111111110111", 2));      

Output : -9

0

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;
}

0

ループ大好き!わーい!

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;

Javaでブール値をintに変換することに触発された2つのループ変数を使用した右から左(絶対に恐ろしい):

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;

0

パフォーマンスが心配でInteger.parseInt()Math.pow()高すぎる場合。ビット操作を使用して、同じことを2倍の速さで実行できます(私の経験に基づく):

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.