字符串数字转二进制,16进制表示

将字符串表示的数字转换成为16位二进制和4位16进制表示的数字,位数不够的前面补0。16进制表示时字母用大写表示,并用字符串输出。如果数字超出范围,输出"NODATA";字符串不是数字,输出"INPUTERROR"。例如输入“15”,输出“0000000000001111,000F”
思路
1、将字符串转换为数字,判断该字符串是不是表示数字,并判断范围有没有超过16位二进制表示的范围。如果是正数,小于等于32767,如果是负数,绝对值小于等于32768。
2、如果是正数不变,如果是需将负数用补码表示
3、求出数字转成二进制后的每一位,插入到StringBuilder的开头,每求出4位后转成16进制表示。
public static String solution(String number) {
        // write code here
        boolean flag = true;
        int n=0;
        if(number.charAt(n) == '+'){
            n++;
        }
        if(number.charAt(n) == '-'){
            n++;
            flag = false;
        }
        int res = 0;
        StringBuilder builder = new StringBuilder();
        StringBuilder builder1 = new StringBuilder();
        Map<Integer, Character> map = new HashMap<Integer, Character>();
        map.put(0,'0');
        map.put(1,'1');
        map.put(2,'2');
        map.put(3,'3');
        map.put(4,'4');
        map.put(5,'5');
        map.put(6,'6');
        map.put(7,'7');
        map.put(8,'8');
        map.put(9,'9');
        map.put(10,'A');
        map.put(11,'B');
        map.put(12,'C');
        map.put(13,'D');
        map.put(14,'E');
        map.put(15,'F');


        for(int i = n; i < number.length(); i++){
            if(number.charAt(i) - '0' >= 0 && number.charAt(i) - '0' <= 9){
                res = res*10+(number.charAt(i) - '0');
                if(flag && res > 32767){
                    return "NODATA";
                }
                if(!flag && res > 32768){
                    return "NODATA";
                }
            }else {
                return "INPUTERROR";
            }
        }
        if(!flag){
            res = res ^ 0b111111111111111;
            res++;
            res = res | 0b1000000000000000;
        }
        int tmp = 0;
        int j = 4;
        int dig = 1;
        for(int i = 0; i < 16; i++){
            tmp=tmp + (res % 2)*dig;
            dig*=2;
            j--;
            if(j == 0){
                builder1.insert(0,map.get(tmp));
                j = 4;
                tmp = 0;
                dig = 1;
            }
            builder.insert(0, res % 2);
            res= res/2;
        }
        builder.append(',');
        builder.append(builder1.toString());

        return builder.toString();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值