# 原码、补码、反码相互转化demo
原码、补码、反码转化工具想写一个工具类,可以将原码、补码、反码之间进行转化,但是好像都有现成的工具可以用,我还是想写一个来巩固学习内容.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
| 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位的原码转化就不行。我想用字符串重新写一个。