1. 实验要求
在Transformer类中实现以下6个方法
- 将整数真值(十进制表示)转化成补码表示的二进制,默认长度32位
public String intToBinary(String numStr)
- 将补码表示的二进制转化成整数真值(十进制表示)
public String binaryToInt(String binStr)
- 将十进制整数的真值转化成NBCD表示(符号位用4位表示)
public String decimalToNBCD(String decimal)
- 将NBCD表示(符号位用4位表示)转化成十进制整数的真值
public String NBCDToDecimal(String NBCDStr)
-
将浮点数真值转化成32位单精度浮点数表示
-
负数以"-"开头,正数不需要正号
-
考虑正负无穷的溢出(“+Inf”, “-Inf”,见测试用例格式)
-
public String floatToBinary(String floatStr)
- 将32位单精度浮点数表示转化成浮点数真值
- 特殊情况同上
public String binaryToFloat(String binStr)
2. 实验攻略
本次实验推荐使用的库函数有
Integer.parseInt(String s)
Float.parseFloat(String s)
String.valueOf(int i)
String.valueOf(float f)
本次实验不允许使用的库函数有
Integer.toBinaryString(int i)
Float.floatToIntBits(float value)
Float.intBitsToFloat(int bits)
3.具体实现
3.1 整数转二进制补码
- 判断正负,如果为正数,则补码以
0
开始,如果为负数,则补码以1
开始 - 常规思路:统一转化为正数,转换为补码,再根据正负,判断是否需要进行取反加1的操作。
- 其他思路:可以利用模系统互相等价的原理
例如:如果我要求-3的补码,我先求 -3 + 8 = 5 的补码,最后改变符号位即可。因此,代码如下
3.1.1代码实现
public static String intToBinary(String numStr) {
int value = Integer.parseInt(numStr);
char[] ans = new char[32];
Arrays.fill(ans,'0');
bool isNeg = false;
if(value < 0){
value += Math.pow(2, 31);
isNeg = true;
}
int index = 31;
while (value > 0){
if(value % 2 == 1){
ans[index] = '1';
}
index--;
value /= 2;
}
if(isNeg)
{
ans[0] = '1' ;
}
return new String(ans);
}
3.1.2 测试用例
@Test
public void intToBinaryTest1() {
assertEquals("00000000000000000000000000000010", Transformer.intToBinary("2"));
}
@Test
public void intToBinaryTest2() {
assertEquals("10000000000000000000000000000000", Transformer.intToBinary("-2147483648"));
}
@Test
public void intToBinaryTest3() {
assertEquals("00000000000000000000000000001001", Transformer.intToBinary("9"));
}
@Test
public void intToBinaryTest4() {
assertEquals("00000000000000000000000000101001", Transformer.intToBinary("41"));
}
@Test
public void intToBinaryTest5() {
assertEquals("11111111111111111111111111111111", Transformer.intToBinary("-1"))