【问题标题】:Converting binary string from java back into a signed integer将二进制字符串从java转换回有符号整数
【发布时间】:2015-05-02 08:37:12
【问题描述】:

我正在使用 java 内置的 Integer.toBinaryString(myInt) 转换为二进制字符串,然后将该 32 位字符串转换为 8 位字符串。

我的问题在于,将数字转换回有符号整数时,我失去了符号。

例子:

我的智力 = -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) 是否不适用于有符号整数?是否有适用于已签名二进制文件的基数?

【问题讨论】:

标签: java binary parseint radix


【解决方案1】:

虽然表示单数整数,但基本机器架构会考虑符号的最高位。当最高位设置为'1'时,它是一个负数,否则为正数,更准确的整数而不是数字。在您的情况下,您将考虑 32 位中的至少 8 位。但是符号位出现在第 32 位,因此丢失了符号

您可以按如下方式进行位与运算: my_32_bit_number 并将其转换为 int (1000 0000 0000 0000 0000 0000 1111 1111) 会给你所需的 8 位数字

【讨论】:

  • 第 8 位是符号没有办法吗?
  • 而不是整数,使用字节(适用于 8 位整数)并仅考虑 7 位。将第 8 位(MSB-Most Significant bit)设置为前一个数字的符号,即第 32 位。
【解决方案2】:

您应该管理作为符号标记的最高有效位。

下面的代码完全按照您的方式工作,但适用于 (N-1) 位(对于 8 位字符串,N = 8),然后在结果字符串的开头附加 01 以便保留标志。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多