栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

通用进制转化算法------将一个n进制的数转化为m进制

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

通用进制转化算法------将一个n进制的数转化为m进制

任意进制转换和经典的十进制转化为二进制类似,十进制转化为二进制,每次对2取模,然后除以2,直至为0。

所以任意进制的转换同理去写即可


举例:给定一个整数num,十进制转化为十六进制,每次对16取模,然后除以16,直至为0。

需要额外注意负数的情况,根据补码的规则,最高位为符号位,即如果是负数,第32位为1,反之00。

计算机中的运算机制为补码运算,正数的补码为其本身,对于负数,我们加上2^32(相当于按位取反末位加一),将其转移到正数范围内处理,注意int数据范围不够,需要用 long。

需要注意的是要对num为0时进行判断,因为对于负整数,由于最高位一定不是 0,因此不会出现前导零。对于零和正整数,可能出现前导零。

class Solution {
    public String toHex(int num) {
        if(num==0) return "0";
        long n=num;
        if(num<0) n=(long) (Math.pow(2,32)+num);
        StringBuilder sb=new StringBuilder();
        while(n!=0){
            long u=n%16;
            char c=(char) (u+'0');
            if(u>=10) c=(char)(u-10+'a');
            sb.append(c);
            n/=16;
        }
        return sb.reverse().toString();
    }
}

同理,n进制的数num转换为m进制,就先将num转换为10进制的整数,再转换成m进制

举例,将五进制的111转换为16进制

class Solution {
    public String toHex(int num) {
        if(num==0) return "0";
        long n=num;
        if(num<0) n=(long) (Math.pow(2,32)+num);
        StringBuilder sb=new StringBuilder();
        while(n!=0){
            long u=n%16;
            char c=(char) (u+'0');
            if(u>=10) c=(char)(u-10+'a');
            sb.append(c);
            n/=16;
        }
        return sb.reverse().toString();

    }

    public int toDec(int num,int x){
        int base=1;
        int n=0;
        while(num!=0){
            n+=base*(num%10);
            num/=10;
            base*=x;
        }
        return n;
    }

    
    public static void main(String[] args) {
        Solution solution = new Solution();
        int n=solution.toDec(111,5);
        System.out.println(solution.toHex(n));
    }
}

这里的任意进制转换只能2到35进制之间转换,因为超过9之后表示数字的英文只有26个

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/291635.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号