Java에서 이진 문자열을 기본 10 정수로 변환하는 방법


108

해당 기본 10 숫자로 변환하려는 이진 숫자 (선행 0 없음)를 나타내는 문자열 배열이 있습니다. 치다:

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변환이 잘못된 방향으로 진행됩니다. 다단계 변환이 필요하다고 생각하지만 메서드 나 하위 클래스의 올바른 조합을 찾을 수없는 것 같습니다. 또한 선행 0 또는 그 부족이 문제가 될 정도도 모르겠습니다. 누구든지 나를 가리키는 좋은 방향이 있습니까?



답변:


263

기수지정해야합니다 . Integer#parseInt()당신이 할 수 있는 과부하가 있습니다.

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

1
완전. 기수를 허용하는 parseInt 문서에서 두 번째 줄을 완전히 놓쳤습니다. 꿈처럼 작동합니다.
dwwilson66

1
선행 0에서도 작동합니까? 확인하는 중이지만 이유는 알 수 없습니다.
Siddhartha

@NagabhushanBaddi 예? 2의 보수 표현을 통과하고 있습니까?
Matt Ball

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 빼기 인덱스 더하기 1은 2로 곱해졌습니다. 제가 bynary에서 착각하지 않았다면 1로 시작하여 그 값에 2를 곱한 다음 결과를 잡고 1에 2를 곱하면 3 자리가됩니다. on
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; } 반환 결과; }
크리스토퍼 Cabezudo 로드리게스

1
이 코드 조각은 작동하지 않습니다. for루프 및 새 result변수 계산이 올바르지 않습니다.
trylimits 2015-08-05

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
이진수에서 십진수로 변환 된 -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

누산기가있는 while 루프, 왼쪽에서 오른쪽 ( l변경되지 않음) :

int n = 0,
    j = -1,
    l = myString.length();
while (++j < l) n = (n << 1) + (myString.charAt(j) == '0' ? 0 : 1);
return n;

Convert boolean to int in Java (절대 끔찍한) 에서 영감을 얻은 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()너무 비싸다. 비트 조작을 사용하여 동일한 작업을 두 배 빠르게 수행 할 수 있습니다 (내 경험에 따라).

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.