原码、补码、反码相互转化demo
原码、补码、反码转化工具想写一个工具类,可以将原码、补码、反码之间进行转化,但是好像都有现成的工具可以用,我还是想写一个来巩固学习内容.
public class SOTConvert {
public static void main(String[] args) {
menu();
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
switch (choice){
case 1:
/**
* 这里的输入是一个十进制的数,我要将它转化为二进制,才能调用方法
*/
System.out.println("请输入原码:");
String binaryString = scanner.next();
int decimalNumber = Integer.parseInt(binaryString, 2);
System.out.println("原码:"+binaryString+"的补码为:"+originalToComplement(decimalNumber));
break;
case 2:
System.out.println("请输入原码:");
String binaryString1 = scanner.next();
int decimalNumber1 = Integer.parseInt(binaryString1, 2);
System.out.println("原码:"+binaryString1+"的反码为:"+originalToReverse(decimalNumber1));
break;
case 3:
System.out.println("请输入补码:");
int num2 = scanner.nextInt();
System.out.println("补码:"+num2+"的原码为:"+complementToOriginal(num2));
break;
case 4:
System.out.println("请输入补码:");
int num3 = scanner.nextInt();
System.out.println("补码:"+num3+"的反码为:"+complementToReverse(num3));
break;
case 5:
String binaryString6 = "11111111111111111111111111000111";
int num = Integer.parseInt(binaryString6, 2);
System.out.println(num);
break;
case 6:
System.out.println("请输入反码:");
int num5 = scanner.nextInt();
System.out.println("反码:"+num5+"的补码为:"+reverseToComplement(num5));
break;
case 7:
System.out.println("请输入要转换的数字:");
int num6 = scanner.nextInt();
System.out.println("请输入要转换的进制:");
int radix = scanner.nextInt();
System.out.println("我程序的转化结果为:");
System.out.println("正确转换结果为:"+Integer.toString(num6,radix));
break;
case 8:
System.out.println("退出");
break;
default:
System.out.println("输入错误");
}
}
private static String reverseToComplement(int num5) {
return null; }
private static String reverseToOriginal(int num4) {
return null; }
private static String complementToReverse(int num3) {
return null; }
private static String complementToOriginal(int num2) {
return null; }
private static String originalToReverse(int num1) {
Integer origin = num1;
//对于负数,首先确定其绝对值的原码表示。
//将原码的符号位保持不变,其他位取反,得到反码。
while (num1!=0&&num1!=1){
num1 = num1>>1;
}
if (num1==1){
//负数
//符号位不变,按位取反
origin =origin & 0x7FFFFFFF;
origin = ~origin;
return Integer.toBinaryString(origin);
}
return Integer.toBinaryString(origin);
}
//int类型可以存储十进制、十六进制、八进制和二进制的整数,最多存储32位的二进制整数。而且由于1位是符号位,它的范围是-2^31~2^31-1
//我发现十六进制的数很好玩,它不像二进制一样要写这么多。0x7F就可以表示最低7位为1,其余位为0的数。0x80就可以表示最高位为1,其余位为0的数.为按位或和按位与提供了很好的选择
//>>操作符就是将x的二进制数向右移动y位,如果x是一个正数,那么在高位补0,如果x是一个负数,那么在高位补1
private static String originalToComplement(int num) {
//原码转化为补码分为几步
//原码本身就是二进制表示的
//1.原码的符号位不变,其余位取反
//先符号位取反,然后就可以全部取反等于符号位不变
num &= 0x7FFFFFFF;
System.out.println(num);
num = ~num;
System.out.println(num);
//2.将取反后的结果加1
int result = num + 1;
// 32位有符号二进制数
// System.out.println(String.format("%32s", Integer.toBinaryString(num)).replace(' ', '0'));
int originalBitCount = Integer.toBinaryString(num).length();
String binaryString = Integer.toBinaryString(result);
//5.如果结果的位数不够,需要在前面补0
while (binaryString.length() < originalBitCount){
binaryString = "0"+binaryString;
}
//3.符号位不变
//4.将结果转化为二进制
binaryString = Integer.toBinaryString(result);
//6.如果结果的位数超过了原码的位数,需要舍去多余的位数
if (binaryString.length()>originalBitCount){
binaryString = binaryString.substring(binaryString.length()-originalBitCount);
}
//7.如果结果的位数等于原码的位数,那么结果就是补码
return binaryString;
}
private static Integer radixConvert(int num, int radix) {
return null;
}
private static void menu(){
System.out.println("1.原码转补码");
System.out.println("2.原码转反码");
System.out.println("3.补码转原码");
System.out.println("4.补码转反码");
System.out.println("5.反码转原码");
System.out.println("6.反码转补码");
System.out.println("7.进制转换");
System.out.println("8.退出");
}
}
上面的是原码转化为补码的已经完成了,但是完成之后我又发现一个问题。就是:输入又位数限制,限制了32位的输入,如果我想要100位的原码转化就不行。我想用字符串重新写一个。