原码、补码、反码相互转化demo

原码、补码、反码相互转化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位的原码转化就不行。我想用字符串重新写一个。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值