二进制、十六进制和十进制的转换算法

一、二进制和十进制的转换

/**
 * 十进制和二进制间的转换
 */
public class IntToBinary {
    public static void main(String[] args) {
        int a = -23422;
        String str;
        System.out.println("======================使用自己写的方法=============================");
        str = intToBinaryString(a);
        System.out.println(str);
        System.out.println(binaryStringToInt(str));
        System.out.println("======================使用Integer中的方法=============================");
        str = Integer.toBinaryString(a);
        System.out.println(str);
//        System.out.println(Integer.parseInt(binaryString, 2));    //只能转换正数,转换负数报错
        System.out.println(Integer.parseUnsignedInt(str, 2));

    }

    /**
     * int转二进制字符串
     *
     * 算法一:除2取余
     *  正数:除2取余-->倒序
     *  负数(补码):先加1-->转换成正数-->除2取余,并取反-->高位补1-->倒序
     * @param num 整数
     */
    public static String intToBinaryString(int num){
        StringBuilder stringBuilder = new StringBuilder();
        boolean flag = false;   //标志:true表示为负数
        int rem;
        if (num == 0){
            return "0";
        }else if(num < 0){
            flag = true;
            num = Math.abs (num + 1);
        }

        while (num != 0){
            //正数,保持不变;负数,取反
            rem = (!flag && num % 2 == 0) || (flag && num % 2 == 1) ? 0 : 1;
            num = num / 2;
            stringBuilder.append(rem);
        }

        //判断是否为负数,如果是负数,那么前面所有位补1
        if(flag){
            num = stringBuilder.length();
            for(int i = 1; i <= 32 - num; i++){
                stringBuilder.append("1");
            }
        }

        return stringBuilder.reverse().toString();

    }

    /**
     * int转二进制字符串
     *
     * 算法二:原数据的每一位和1进行与运算,判断1和0
     * @param num 整数
     */
    public static String intToBinaryString2(int num){
        StringBuilder stringBuilder = new StringBuilder();
        boolean flag = false;   //标志:true表示为负数

        for(int j=31;j>=0;j--) {

            if (((1 << j) & num) != 0){
                flag = true;
                stringBuilder.append("1");
            } else{
                if (flag){
                    stringBuilder.append("0");
                }
            }
        }

       return stringBuilder.toString();

    }

    /**
     * 二进制字符串转int
     *
     * 算法一:每位数字* 2的n-1次方,并相加
     * @param binaryStr 二进制字符串
     */
    public static int binaryStringToInt(String binaryStr){
        int result =0, rem;
//        //正序遍历
//        for (int i = 0; i < binaryStr.length(); i++){
//            char c = binaryStr.charAt(i);
//            rem = c - ‘0‘;
//
//            //使用Math.pow()方法,计算2的n-1次方
////            result += rem * (int) Math.pow(2, (binaryStr.length() - 1 - i));
//
//            //使用位移,计算2的n-1次方
//            result += rem << (binaryStr.length() - 1 - i);
//        }

        //倒序遍历
        int _pow = 1;
        for (int i = binaryStr.length() - 1; i >= 0 ; i--){
            char c = binaryStr.charAt(i);
            rem = c - ‘0‘;

            result += rem * _pow;
//            _pow = (int) Math.pow(2, (binaryStr.length() - i));  //使用Math.pow()方法,计算2的n-1次方
            _pow = _pow << 1;   //使用位移,计算2的n-1次方
        }
       return result;
    }

    /**
     * 二进制字符串转int
     *
     * 算法二:使用二进制转十进制的逆运算:被除数 = 除数 * 商 + 余数
     * @param binaryStr 二进制字符串
     */
    public static int binaryStringToInt2(String binaryStr){
        int result =0, rem, temp;
        for (int i = 0; i < binaryStr.length(); i++){
            char c = binaryStr.charAt(i);
            rem = c - ‘0‘;  //计算出二进制值0或1
            //使用二进制转十进制的逆运算:被除数 = 除数 * 商 + 余数
            result = result * 2 + rem;
        }
       return result;
    }
}

二、十六进制和十进制的转换

package com.wslook.algorithm.radix;

public class IntToHexString {
    public static void main(String[] args) {
        int a = 23422;
        String str;
        System.out.println("======================使用自己写的方法=============================");
        str = intToHexString(a);
        System.out.println(str);
//        str = "ffffa482";
        System.out.println(hexStringToInt2(str));
        System.out.println("======================使用Integer中的方法=============================");
        str = Integer.toHexString(a);
        System.out.println(str);
//        System.out.println(Integer.parseInt(binaryString, 16));    //只能转换正数,转换负数报错
        System.out.println(Integer.parseUnsignedInt(str, 16));

    }

    /**
     * int转十六进制字符串
     *
     * 算法一:先求出二进制字符串,再转换成十六进制字符串
     * @param num 整数
     */
    public static String intToHexString(int num){
        String binaryStr = IntToBinary.intToBinaryString(num);

        //二进制串转十六进制串
        int count = binaryStr.length();
        StringBuilder sb = new StringBuilder();
        String subStr;
        while (count > 0){

            if (count <= 4){
                subStr = binaryStr.substring(0, count);
            }else {
                subStr = binaryStr.substring(count - 4, count);
            }

            count -= 4;
            int c = IntToBinary.binaryStringToInt2(subStr);
            sb.append(trans(c));

        }

        return sb.reverse().toString();

    }

    /**
     * 整数转十六进制字符串
     * @param deci 小于16的正整数
     * @return
     */
    private static char trans(int deci){
        if (deci < 10){
            return (char) (deci + 48);
        }

//        return (char) (deci + 55);  //转成大写A-F
        return (char) (deci + 87);  //转成小写a-f
    }

    /**
     * 十六进制字符串转int
     *
     * 算法一:每位数字* 2的n-1次方,并相加
     * @param str 十六进制字符串
     */
    public static int hexStringToInt(String str){
        int result = 0, rem = 0, _pow = 1;
        //正序遍历字符串
        for (int i = 0; i < str.length(); i++){
            char hex = str.charAt(i);
            if (hex >= ‘0‘ && hex <= ‘9‘){
                rem = hex - 48;     //转换成数字0-9
            }else if (hex >= ‘a‘ && hex <= ‘f‘){
                rem = hex - 87;     //转换成数字10-15,‘a‘= 97
            }else if (hex >= ‘A‘ && hex <= ‘F‘){
                rem = hex - 55;     //转换成数字10-15,‘A‘= 65
            }

            //使用位移,计算16的n-1次方-----【16的n次方 =  1 << 4n】
            _pow = (int) Math.pow(16, (str.length() - 1 - i));
//            _pow = 1 << (4 * (str.length() -1 - i));
            result += rem * _pow;
        }

//        //倒序遍历字符串
//        for (int i = str.length() - 1; i >= 0; i--){
//            char hex = str.charAt(i);
//            if (hex >= ‘0‘ && hex <= ‘9‘){
//                rem = hex - 48;
//            }else if (hex >= ‘a‘ && hex <= ‘f‘){
//                rem = hex - 87;
//            }else if (hex >= ‘A‘ && hex <= ‘F‘){
//                rem = hex - 55;
//            }
//
//            //使用位移,计算16的n-1次方-----【16的n次方 = 2 << (4n -1)】
//            result += rem * _pow;
////            _pow = (int) Math.pow(16, (str.length() - i));
//            _pow = _pow << 4;
//        }
       return result;
    }

    /**
     * 十六进制字符串转int
     *
     * 算法二:使用十六进制转十进制的逆运算:被除数 = 除数 * 商 + 余数
     * @param str 十六进制字符串
     */
    public static int hexStringToInt2(String str){
        int result =0, rem = 0, temp;
        for (int i = 0; i < str.length(); i++){
            char hex = str.charAt(i);
            if (hex >= ‘0‘ && hex <= ‘9‘){
                rem = hex - 48;     //转换成数字0-9
            }else if (hex >= ‘a‘ && hex <= ‘f‘){
                rem = hex - 87;     //转换成数字10-15,‘a‘= 97
            }else if (hex >= ‘A‘ && hex <= ‘F‘){
                rem = hex - 55;     //转换成数字10-15,‘A‘= 65
            }
            //使用十六进制转十进制的逆运算:被除数 = 除数 * 商 + 余数
            result = result * 16 + rem;
        }
       return result;
    }
}

原文地址:https://www.cnblogs.com/wslook/p/9385415.html

时间: 2024-10-03 13:30:08

二进制、十六进制和十进制的转换算法的相关文章

八进制与十六进制与十进制的转换

二进制.八进制.十六进制与十进制的不同顾名思义在于进位不同: 十进制遇十进一,9+1=10,19+1=20,199+1=200.相同数字前一位是后一位的十倍,例如11,前一个代表10,后一个是1. 八进制遇八进一,7+1=10,17+1=20,27+1=30.相同数字前一位是后一位的八倍,例如11,前一个代表8,后一个是1: 故换算成十进制:11(八进制)=1*8+1=9(十进制),23(八进制)=2*8+3=19(十进制) 十进制换八进制:129/8=16余1,16/8=2余0,故八进制为20

[No000071]C# 进制转换(二进制、十六进制、十进制互转)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 进制转换 { class Program { static void Main(string[] args) { //由于二进制数在C#中无法直接表示,所以所有二进制数都用一个字符串来表示,例如: 二进制: 1010 表示为 字符串:"1010&q

C# 进制转换(二进制、十六进制、十进制互转)

由于二进制数在C#中无法直接表示,所以所有二进制数都用一个字符串来表示 例如: 二进制: 1010 表示为 字符串:"1010" int d = 10; //十进制转二进制字符串 Console.WriteLine(Convert.ToString(d,2)); //输出: 1010 //十进制转十六进制字符串 Console.WriteLine(Convert.ToString(d,16)); //输出: a //二进制字符串转十进制数 string bin = "1010

二进制与十进制互相转换

二进制如何转十进制,十进制如何转二进制 学计算机的朋友刚开始学习时都要接触进制之间的转换,二进制.十进制.八进制.十六进制等,这个是很枯燥的,转来转去就转蒙圈了,别蒙别蒙,今天咱们一个一个搞定,看看二进制和十进制之间如何相互转换的. 方法 转二进制主要有以下几种 正整数转二进制 负整数转二进制 小数转二进制 正整数转二进制 要点:除2取余,然后倒序排列,高位补零 也就是说,将正的十进制数除以二,得到的商再除以二,依次类推直到商为零或1时为止,然后在旁边标出各步的余数,最后倒着写出来,高位补零就O

java语言将任意一个十进制数数字转换为二进制形式,并输出转换后的结果

1 package com.llh.demo; 2 3 import java.util.Scanner; 4 5 /** 6 * 7 * @author llh 8 * 9 */ 10 public class Test { 11 /* 12 * 将任意一个十进制数数字转换为二进制形式,并输出转换后的结果(使用数组存储) 13 */ 14 public static void main(String[] args) { 15 Scanner sc = new Scanner(System.in

〖Linux〗Shell十进制数值转换十六进制

1 dec2hex(){ 2 printf "%x" $1 3 } 4 5 a=$(dec2hex 2131165531) 6 echo $a [Linux]Shell十进制数值转换十六进制,布布扣,bubuko.com

UTC格式转换 &amp; 十六进制换算为十进制

UTC格式转换成北京时间格式: /// <summary> /// UTC格式与datatime的转换 /// </summary> /// <param name="utc"></param> /// <returns></returns> public DateTime ConvertIntDatetime(double utc) { System.DateTime startTime = TimeZone.C

任意进制转换算法

任意进制转换算法 N年没有写博客,发个进制转换的玩下,支持负数:功能属于简化版的 Convert.ToInt32 ,特点是: 1.任意位,如:0,1(二进制),0...7(八进制),0...9,A...F(16进制),0...N(N进制),或者是:[email protected]#$%^&*(8进制,字符符号),也可以是中文. 2.8 byte 最大长度. 3.C#源码. 最近写markdown格式习惯啦,cnblogs啥时候全改掉算了,别用这个htmleditor算了. 先说明下进制转换的基

c 十六进制 转 十进制

考虑到举一反三,这里顺便上完整代码,顺便可以考虑实现R进制和十进制的转换. 完整代码: 1 #include <stdio.h> 2 #include <math.h> 3 4 double 5 hexToDecimal(int); 6 7 double 8 octToDecimal(int); 9 10 double 11 toDecimal(int, int, int); 12 13 int 14 main(void) { 15 int a = 0x3c; 16 double