我使用java内置的Integer.toBinaryString(myInt)
转换为二进制字符串,然后我将该32位字符串转换为8位字符串。
我的问题在于,当将数字转换回有符号整数时,我会丢失符号。
示例:
我的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 :(得分:1)
在表示有问题的整数时,基本的机器架构会考虑符号的最高位。当最高位设置为“1”时,则其为负数,否则为正数,更准确的整数而不是数字。在你的情况下,你将考虑32位中的至少8位。但是在第32位出现了符号位,因此失去了符号
您可以执行以下操作: my_32_bit_number&amp;将此转换为int(1000 0000 0000 0000 0000 0000 1111 1111) 会给你所需的8位数
答案 1 :(得分:0)
您应该管理最重要的位,这是标志的标记。
下面的代码完全按照您的方式执行,但适用于(N-1)位(对于8位字符串,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);
}