2015-03-02 3 views
1

Я использую java, встроенный в Integer.toBinaryString(myInt), для преобразования в двоичную строку, а затем я конвертирую эту 32-битную строку в 8-битную строку.Преобразование двоичной строки из java обратно в целое число со знаком

Моя проблема заключается в том, что при преобразовании числа обратно в знак-целое я теряю знак.

Пример:

My Int = -5.

Двоичное представление = 11111011.

Преобразование обратно в целое число: 251.

Некоторые из моего кода:

//Converts an integer to 8-bit binary. 
public static String convertTo8BitBinary(int myNum){ 
    String intToConv = Integer.toBinaryString(myNum); 
    //the number is less than 8-bits 
    if(intToConv.length()<8){ 
     String append=""; 
     for(int i = 8 - intToConv.length(); i>0;i--){ 
      append += "0"; 
     } 
     intToConv = append+intToConv; 
    //the number is more than 8 bits 
    }else { 
     intToConv = intToConv.substring(intToConv.length() - 8, intToConv.length()); 
    } 
    return intToConv; 
} 

//Converts an 8-bit binary string to an integer. 
public static int convertToIntegerFromBinary(String b){ 
    return Integer.parseInt(b,2); 
} 

Любые идеи, как я могу сохраняющие знак? Не работает ли Integer.parseInt (b, 2) для целых чисел со знаком? Есть ли основание, которое работает для подписанных двоичных файлов?

+0

Как насчет этого вопроса: http://stackoverflow.com/questions/14012013/java-converting-negative-binary- back-to-integer? – Everv0id

ответ

1

Представляя одинарные целые числа, основная архитектура машины учитывала бы самый старший бит для знака. Когда самый верхний бит установлен на «1», тогда его отрицательное число, иначе положительное число, более точное целое число вместо числа. В этом случае вы будете рассматривать наименее 8 бит из 32 бит. Но знаковый бит присутствует на 32-й позиции, следовательно, потери знака

Вы могли бы сделать немного операцию И следующим образом: my_32_bit_number & завуалированный это INT (1000 0000 0000 0000 0000 0000 1111 1111) даст вам требуется 8 бит-номер

+0

Нет ли способа работать с 8-м битом, являющимся знаком? – Tukajo

+0

Вместо Integer используйте Byte (apt для 8-битных целых чисел) и учитывайте только 7 бит. Установите 8-й бит (бит MSB-Most Significant) на знак предыдущего номера i.e, 32-го бита. – HJK

0

Вы должны управлять самым значительным битом, который является маркером для знака.

ниже код делать именно то, что вы делаете, но работает на (N-1) битов (для 8bits строк, N = 8), а затем присоединяет 0 или 1 в начале строки результата, чтобы сохранить знак ,

//Converts an integer to n-bit binary. 
public static String convertToNBitBinary(int myNum, int nBitSigned){ 
    int nBitUnsigned = nBitSigned -1; 

    if(myNum > Math.pow(2,nBitUnsigned) || myNum <= -Math.pow(2,nBitUnsigned)){ 
     return "OutOfBound"; 
    } 

    String intToConv = Integer.toBinaryString(Math.abs(myNum)); 

    //the number is less than nBitUnsigned 
    if(intToConv.length()<nBitUnsigned){ 
     String append=""; 
     for(int i = nBitUnsigned - intToConv.length(); i>0;i--){ 
     append += "0"; 
     } 
     intToConv = append + intToConv; 
    }else { //the number is more than 8 bits 
     intToConv = intToConv.substring(intToConv.length() - nBitUnsigned); 
    } 
    intToConv = (myNum <0?"1":"0") + intToConv; 
    return intToConv; 
} 

Второй метод должен быть исправлен по той же причине:

//Converts an N-bit binary string to an integer. 
public static int convertToIntegerFromBinary(String b){ 
    String number = b.substring(1); 

    return (b.charAt(0) == '0'?1:-1)*Integer.parseInt(number, 2); 
} 
Смежные вопросы