วิธีการแปลง Binary String เป็นเลขฐาน 10 จำนวนเต็มใน Java


110

ฉันมีอาร์เรย์ของสตริงที่แสดงถึงเลขฐานสอง (โดยไม่มีเลขศูนย์นำหน้า) ที่ฉันต้องการแปลงเป็นเลขฐาน 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การแปลงผิดทิศทางหรือไม่ ฉันสงสัยว่าจะต้องทำการแปลงหลายขั้นตอน แต่ดูเหมือนจะไม่พบวิธีการหรือคลาสย่อยที่ผสมผสานกันอย่างถูกต้อง ฉันยังไม่แน่ใจว่าเลขศูนย์นำหน้าหรือขาดไปจะเป็นปัญหามากน้อยเพียงใด ใครมีแนวทางดีๆช่วยชี้ทางหน่อยครับ



คำตอบ:


267

คุณจำเป็นต้องระบุมุฎฐาน มีการโอเวอร์โหลดInteger#parseInt()ซึ่งช่วยให้คุณทำได้

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

1
ความสมบูรณ์แบบ ฉันพลาดบรรทัดที่สองในเอกสาร parseInt ที่อนุญาตให้ใช้ radix ทำงานเหมือนความฝัน
dwwilson66

1
สิ่งนี้ใช้ได้กับเลขศูนย์นำหน้าด้วยหรือไม่? เพียงแค่ยืนยันแม้ว่าฉันจะไม่เห็นเหตุผลว่าทำไมไม่
สิทธารถะ

@NagabhushanBaddi ตัวอย่าง? คุณผ่านการเป็นตัวแทนเสริมทั้งสองหรือไม่?
Matt Ball

20

สิ่งนี้อาจใช้ได้:

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
สิ่งนี้มีประโยชน์สำหรับฉันเพราะฉันต้องทำโครงการโรงเรียนที่มีการแปลงโดยไม่ต้องใช้สิ่งที่จาวามีอยู่แล้ว
bucksnort2

มีใครทดสอบสิ่งนี้มาก่อนหรือไม่? นี่หมายเลขความยาวลบดัชนีบวก 1 จะคูณด้วย 2 ถ้าฉันจำไม่ผิดคุณเริ่มต้นด้วย 1 และคูณค่านั้นด้วย 2 จากนั้นคว้าผลลัพธ์และคูณด้วย 1 ด้วย 2 ซึ่งจะเป็น 3 ตำแหน่งของคุณและอื่น ๆ บน
Christopher Cabezudo Rodriguez

(กล่องแสดงความคิดเห็นไม่ดีสำหรับสนิปเพ็ต) นี่คือรหัสที่ฉันใช้ฐานในของคุณ (ฉันหลงทางและใช้ของคุณเป็นเทมเพลต) สาธารณะคงที่ binaryToInteger (สตริงไบนารี) {char [] numbers = binary ToCharArray (); ผล int = 0; int posValue = 1; สำหรับ (int i = numbers.Length - 1; i> = 0; i--) {if (numbers [i] == '1') {result + = posValue; } posValue * = 2; } ผลตอบแทน; }
Christopher Cabezudo Rodriguez

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
ฉันต้องการ -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

แก้ไขเวอร์ชันของ Integer.parseInt (ข้อความ) ของ java ให้ทำงานกับตัวเลขเชิงลบ:

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;

ขวาไปซ้ายพร้อม 2 loop vars ซึ่งได้รับแรงบันดาลใจจากConvert boolean เป็น int ใน 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;

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.