任意位数的两个16进制加法运算

前段时间因为项目需要,要求需要用到两个30位的16进制数运算相加,普通的类型转换会溢出,无法得出真正的结果,用ASP脚本写了算法,下班没事用Java写了这个可以进行任意位 数的16进制加法运算算法,希望得到指正修改,下面是代码:

package com.xhs.test;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        while(true) {
            System.out.println("请输入一个十六进制数:");
            Scanner sc = new Scanner(System.in);
            String hexStr1 = sc.nextLine();
            System.out.println("请输入另一个十六进制数:");
            String hexStr2 = sc.nextLine();
            String addRet = addHex(hexStr1.toUpperCase(),hexStr2.toUpperCase());
            System.out.println("结果为:"+addRet);
            System.out.println("是否继续?1.继续 2.退出");
            int choose = sc.nextInt();
            if(choose == 2) {
                System.out.println("程序已退出!");
                break;
            }
        }
    }

    private static String addHex(String hexStr1, String hexStr2) {
        String hexStr = "";
        //比较两个字符串的长度,通过交换位置保证第一个字符串比第二个长
        if(hexStr2.length() > hexStr1.length()) {
            hexStr = hexStr1;
            hexStr1 = hexStr2;
            hexStr2 = hexStr;
        }
        //将字符串变为字符数组
        char []hexChr1 = hexStr1.toCharArray();
        char []hexChr2 = hexStr2.toCharArray();
        Object addRet = "";
        int jingwei = 0;
        StringBuffer sb = new StringBuffer();
        //遍历字符数组
        for(int i = hexChr2.length-1;i >= 0;i--) {
            int flag2 = getInt(hexChr2[i]);
            int flag1;
            if(hexStr1.length() == hexStr2.length()) {
                flag1 = getInt(hexChr1[i]); 
            }else {
                flag1 = getInt(hexChr1[i+hexStr1.length()-hexStr2.length()]);                
            }
            int sum = flag1 + flag2 + jingwei;
            if(sum > 9 && sum < 16) {
                addRet = getHex(sum);
                jingwei = 0;
            } else if(sum >=16) {
                //如果相加的和大于等于16,求余并向前进位
                addRet = sum % 16;
                if((int)addRet > 9) {
                    addRet = getHex((int)addRet);
                }
                jingwei = 1;                
            } else {
                addRet = sum;
                jingwei = 0;
            }
            sb.insert(0,addRet);
        }
        //如果两个字符串的长度不相等,计算多出来的那一段字符
        if(hexStr1.length() != hexStr2.length()) {
            for(int i=hexStr1.length()-hexStr2.length()-1;i>=0;i--) {
                if(jingwei == 1) {
                    int flag = getInt(hexChr1[i]);
                    addRet = flag+jingwei;
                    if((int)addRet > 9 && (int)addRet < 16) {
                        addRet = getHex((int)addRet);
                        jingwei = 0;
                    }else if((int)addRet >= 16){
                        addRet = (int)addRet % 16;
                        jingwei = 1;
                    }
                    sb.insert(0,addRet);
                } else {
                    sb.insert(0,hexChr1[i]);                    
                }
            }
        }
        //最后再判断进位,如果进位为1,再向前进一位
        if(jingwei == 1) {
            sb.insert(0,jingwei);
        }
        return sb.toString();
    }
    
    /**
     *   通过字符得到对应的十进制数
     * */
    private static int getInt(char chr) {
        int flag;
        switch(chr) {
        case 'A':
            flag = 10;
            break;
        case 'B':
            flag = 11;
            break;
        case 'C':
            flag = 12;
            break;
        case 'D':
            flag = 13;
            break;
        case 'E':
            flag = 14;
            break;
        case 'F':
            flag = 15;
            break;
        default:
            flag = Integer.parseInt(chr+"");
            break;
    }
        return flag;
    }
    
    /**
     * 通过十进制数得到对应的16进制字符
     * */
    private static char getHex(int i) {
        char c = 0;
        switch(i) {
            case 10:
                c = 'A';
                break;
            case 11:
                c = 'B';
                break;
            case 12:
                c = 'C';
                break;
            case 13:
                c = 'D';
                break;
            case 14:
                c = 'E';
                break;
            case 15:
                c = 'F';
                break;
        }
        return c;
    }
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
二进制图文详解 二进制Binary 2进制 逢二进一的计数规则。 在计算机内部,一切数据都是2进制的!! 2进制的数字 补码 补码本质是一种解决负数问题的算法。 1. 将数据的一半当做负数使用。 2. 补码在内存中是2进制的,显示的时候为10进制。 - Java利用算法支持了补码计算: - Integer.parseInt() - Integer.toString() 3. 补码的缺点: - 不支持超范围计算 - 超范围计算自动溢出 4. 解决补码的缺点:采用更大范围(更多位数)的补码 Java是如何计算 -2-1 的 补码的规律 1. 最大值的规律:最高位0 剩下全是1 - int类型:一个0,31个1 - long类型:一个0,63个1 2. 最小值的规律:最高位1 剩下全是0 - int类型:一个1,31个0 - long类型:一个1,63个0 3. 负数的最高位是1, 正数最高位是0 - 最高位做为识别正数和负数的标志位:称为符号位 - 注意:符号位不是用来表示正负号的!!! 4. -1 的规律:所有位都是1!! 5. 溢出是有规律的! 是一个周期性计算结果。 - 最大值+1 = 最小值 6. 补码的对称现象:-n = ~n + 1 案例: int max = Integer.MAX_VALUE; System.out.println(Integer.toBinaryString(max)); int min = Integer.MIN_VALUE; System.out.println(Integer.toBinaryString(min)); long lmax = Long.MAX_VALUE; System.out.println(Long.toBinaryString(lmax)); long lmin = Long.MIN_VALUE; System.out.println(Long.toBinaryString(lmin)); //-1的规律 int n = -1; System.out.println(Integer.toBinaryString(n)); long l = -1L; System.out.println(Long.toBinaryString(l)); //最大值+1溢出得到最小值 // 推论:Java中的int数字是按照补码圆环排列的 int m = Integer.MAX_VALUE+1; System.out.println(m);//最小值 //一个数的溢出测试: n = 345; m = n + Integer.MAX_VALUE+1; System.out.println(m);//负数 m = n + Integer.MAX_VALUE+1+ Integer.MAX_VALUE; System.out.println(m);//344 正数 m = n - (Integer.MAX_VALUE+1+ Integer.MAX_VALUE+1); System.out.println(m);//345 正数 经典面试题1 正数的溢出结果是负数(错误!!!) 经典面试题2 int i = Integer.MAX_VALUE+1; System.out.println( Integer.toBinaryString(i)); 选择运行结果(D): A. 11111111111111111111111111111111 B. 1111111111111111111111111111111 C. 01111111111111111111111111111111 D. 10000000000000000000000000000000 经典面试题3 System.out.println(~-55); 如上代码的运算结果: ( 54 ) System.out.println(~-230); 如上代码的运算结果: ( 229 ) System.out.println(~55); 如上代码的运算结果: ( -56 ) 16进制 16进制是2进制的简写形式 2进制运算 1. ~ 取反运算 2. & 与运算(逻辑乘法) 运算规则: 1 & 1 = 1 1 & 0 = 0 0 & 1 = 0 0 & 0 = 0 与运算用途: n: 00010100 11010111 01010001 11101010 m: 00000000 00000000 00000000 11111111

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值