二进制、八进制、十进制、十六进制之间的转换(含小数的转换方法)

一、十进制与二进制互转

1. 二进制转十进制

1011010.100101(2)=90.578125(10)

方法一:“按权相加”法
2561286432168421.0.50.250.1250.06250.031250.0156250.0781250.00390625
2827262524232221202-12-22-32-42-52-62-72-8
//1011010.100101//

64+0+16+8+0+2+0+0.5+0+0+0.0625+0.015625=90.578125(10)

方法二:

1011010.100101(2)
=1×26 + 0×25 + 1×24 + 1×23 + 0×22 + 1×21 + 0×20 + 1×2-1 + 0×2-2 + 0×2-3 + 1×2-4 + 0×2-5 + 1×2-6
=64+0+16+8+0+2+0+0.5+0+0+0.0625+0+0.015625
=90.578125(10)

2. 十进制转二进制

方法一:整数部分“除2倒取余”,小数部分“乘2正取整”

90.578125(10)=90(10)+0.578125(10)
90÷2=45 • • • • • • 0
45÷2=22 • • • • • • 1
22÷2=11 • • • • • • 0
11÷2=5   • • • • • • 1
  5÷2=2   • • • • • • 1
  2÷2=1   • • • • • • 0
  1÷2=0   • • • • • • 1
90(10)=1011010(2)
0.578125(10)
0.578125×2=0.15625• • • • • • 1
0.15625×2  =0.3125  • • • • • • 0
0.3125×2    =0.625    • • • • • • 0
0.625×2      =0.25      • • • • • • 1
0.25×2        =0.5        • • • • • • 0
0.5×2          =0           • • • • • • 1
0.578125(10)=0.100101(2)
90(10)+0.578125(10)=1011010(2)+0.100101(2)=1011010.100101(2)

方法二:整数使用“权位展开法”,小数部分“乘2正取整”

90.578125(10)=64+0+16+8+0+2+0+0.5+0+0+0.0625+0+0.015625

2561286432168421
//1011010

0.578125(10)=同上
90(10)+0.578125(10)=1011010(2)+0.100101(2)=1011010.100101(2)

二、十进制与八进制互转

十进制3278640965126481.0.1250.015625
八进制8584838281808-18-2

1.十进制转八进制

十进制8162464128192512409632768
十进制8181×281×38282×282×3838485
八进制102030100200300100010000100000
方法一:整数部分“除8进位法(8(10)=10(8),8×8(10)=100(8),8×8×8(10)=1000(8))”,小数部分“乘8正取整”

90.578125(10)=90(10)+0.578125(10)=132(8)+0.45(8)=132.45(8)
90(10)
90÷8=11 • • • • • • 2
=11个八进制+2
=8个八进制+3个八进制+2
=100+30+2
=132(8)
0.578125(10)
0.578125×8=0.625 • • • • • • 4
0.625×8      =0        • • • • • • 5
0.578125(10)=0.45(8)
注意:如果小数部分乘8的结果永远带有小数部分,就需要根据实际情况“三舍四入”

方法二:整数部分“除8倒取余”,小数部分“乘8正取整”

90.578125(10)=90(10)+0.578125(10)=132(8)+0.45(8)=132.45(8)
90÷8  =11 • • • • • • 2
11÷8  =  1 • • • • • • 3
1÷8    =  0 • • • • • • 1
90(10)=132(8)
0.578125(10)=0.45(8)

2.八进制转十进制

方法一:按权相加法

132.45(8)=1×83-1+3×81+2×80+4×8-1+5*8-2=64+24+2+4×0.125+5×0.015625=90.578125(10)

方法二(转换较复杂):整数部分“拆分法(100(8)=8×8(8),1000(8)=8×8×8(8),以数量级进行拆分)”,小数部分“按权相加法”

132.45(8)
=100(8)+30(8)+2(10)+(4×8-1)(10)+(5*8-2)(10)
=8×8(8)+3×8(8)+2+4×0.125+5×0.015625
=64+24+2+0.578125
=90.578125(10)

三、十进制与十六进制互转

1.十进制转十六进制

十进制111213141516
十六进制ABCDEF
十进制65536409625616.10.06250.00390625
十六进制16416316216116016-116-2

整数部分除16“倒取余”,小数部分乘16“正取整”
90.578125(10)=90(10)+0.578125(10)=5A(16)+0.94(16)=5A.94(16)
90(10)=5A(16)
90÷16=5 • • • • • • 10=A
5÷16  =0 • • • • • • 5
0.578125(10)=0.94(16)
0.578125×16=0.25 • • • • • • 9
0.25×16        =0      • • • • • • 4

2.十六进制转十进制(“按权相加”法)

5A.94(16)=5×162-1+10×161+916-1+4×16-2=80+10+90.0625+4*0.00390625=90.578125

四、二进制与八进制互转

二进制八进制二进制十六进制
000000000
001100011
010200102
011300113
100401004
101501015
110601106
111701117
001 0001010008
001 0011110019
001 010121010A
001 011131011B
001 100141100C
001 101151101D
001 110161110E
001 111171111F

1. 二进制转八进制:从小数点位置起向左右两边划分,每三个为一组,不足三个的在最左边或最右边添0补齐,对照上边的表进行计算

1011010.100101=001 011 010.100 101=132.45(8)
                                             ←↑→

2. 八进制转二进制:与“二进制转八进制”转换方法相反

132.45(8)=001 011 010.100 101=1011010.100101(2)

3. 二进制转十六进制:从小数点位置起向左右两边划分,每四个为一组,不足四个的在最左或最右添0补齐,对照上边的表进行计算

1011010.100101=0101 1010.1001 0100=5A.94(16)
                                          ←↑→

4. 十六进制转二进制:与“二进制转十六进制”转换方法相反

5A.94(16)=0101 1010.1001 0100=1011010.100101(2)

五、八进制与十六进制互转

1. 八进制转十六进制:

八进制数→二进制数→十六进制数
八进制数→十进制数→十六进制数

2. 十六进制转八进制:

十六进制数→二进制数→八进制数
十六进制数→十进制数→八进制数

六、.NET Code

/// <summary>
/// 二进制转十进制
/// </summary>
public static decimal BinaryToDecimalism(decimal binary)
{
    long integer = (long)binary;
    decimal @decimal = binary - integer;
    integer = Convert.ToInt64(integer.ToString(), 2);
    //使用权位来计算
    var temp = @decimal.ToString().Split('.');
    if (temp.Length <= 1) return integer;
    var decimals = temp[1].ToCharArray();
    decimal tempSum = 0;
    for (int i = 0; i < decimals.Length; i++)
    {
        int value = Convert.ToInt32(decimals[i].ToString());
        tempSum += value * Pow(2, -(i + 1));
    }
    return integer + tempSum;
}

/// <summary>
/// 十进制转二进制
/// </summary>
/// <param name="decimalism">十进制数</param>
/// <param name="reservedDecimalNumber">保留二进制小数位数</param>
/// <returns></returns>
public static string DecimalismToBinary(decimal decimalism, int reservedDecimalNumber = 32)
{
    int integerPart = (int)decimalism;
    decimal fractionalPart = decimalism - integerPart;
    string integerPartResult = Convert.ToString(integerPart, 2);//由于Convert.ToDecimal(str)只能保留小数点后18位,所以方法返回字符串
    if (reservedDecimalNumber < 1 || fractionalPart == 0) return integerPartResult;

    string[] results = new string[reservedDecimalNumber];
    decimal loopIntegerPart = 0;
    decimal loopFractionalPart = fractionalPart;
    /*小数位乘2正取整*/
    for (int i = 0; i < reservedDecimalNumber; i++)
    {
        loopFractionalPart = loopFractionalPart * 2;
        loopIntegerPart = (int)loopFractionalPart;
        loopFractionalPart = loopFractionalPart - loopIntegerPart;
        if (loopFractionalPart > 0)
        {
            results[i] = loopIntegerPart.ToString();
        }
        else
        {
            results[i] = loopIntegerPart.ToString();
            break;
        }
    }
    return integerPartResult + "." + string.Join("", results);
}

private static decimal Pow(decimal x, int y)
{
    decimal value = x;
    if (y > 0)
    {
        for (int i = 1; i < y; i++)
        {
            value *= x;
        }
    }
    else if(y < 0)
    {
        for (int i = 1; i < -y; i++)
        {
            value *= x;
        }
        value = 1 / value;
    }
    else
    {
        value=1;
    }
    return value;
}
  • 10
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您提供一个简单的 C++ 程序,实现二、八、十、十六进制之间的相互转换(包小数)。以下是程序代码: ```cpp #include <iostream> #include <string> #include <cmath> using namespace std; // 二进制十进制 int binToDec(string num) { int len = num.length(); int dec = 0; for (int i = 0; i < len; i++) { dec += (num[i] - '0') * pow(2, len - i - 1); } return dec; } // 八进制十进制 int octToDec(string num) { int len = num.length(); int dec = 0; for (int i = 0; i < len; i++) { dec += (num[i] - '0') * pow(8, len - i - 1); } return dec; } // 十六进制十进制 int hexToDec(string num) { int len = num.length(); int dec = 0; for (int i = 0; i < len; i++) { if (num[i] >= '0' && num[i] <= '9') { dec += (num[i] - '0') * pow(16, len - i - 1); } else if (num[i] >= 'A' && num[i] <= 'F') { dec += (num[i] - 'A' + 10) * pow(16, len - i - 1); } else if (num[i] >= 'a' && num[i] <= 'f') { dec += (num[i] - 'a' + 10) * pow(16, len - i - 1); } } return dec; } // 十进制二进制 string decToBin(int num) { string bin = ""; while (num > 0) { bin = to_string(num % 2) + bin; num /= 2; } return bin; } // 十进制八进制 string decToOct(int num) { string oct = ""; while (num > 0) { oct = to_string(num % 8) + oct; num /= 8; } return oct; } // 十进制十六进制 string decToHex(int num) { string hex = ""; while (num > 0) { int tmp = num % 16; if (tmp < 10) { hex = to_string(tmp) + hex; } else { hex = (char)('A' + tmp - 10) + hex; } num /= 16; } return hex; } // 浮点数转换为整数和小数部分 void splitFloat(double num, int& integer, double& fraction) { integer = (int)num; fraction = num - integer; } // 小数部分二进制 string fractionToBin(double fraction) { string bin = ""; int count = 0; while (fraction > 0 && count < 6) { // 最多保留6位小数 fraction *= 2; if (fraction >= 1) { bin += '1'; fraction -= 1; } else { bin += '0'; } count++; } return bin; } int main() { string num; int base; cout << "请输入要转换的数(包小数):" << endl; cin >> num; cout << "请输入要转换的数的进制(2, 8, 10, 16):" << endl; cin >> base; int integer; double fraction; splitFloat(stod(num), integer, fraction); string result = ""; if (base == 2) { result = decToBin(integer) + "." + fractionToBin(fraction); } else if (base == 8) { result = decToOct(integer) + "." + fractionToBin(fraction); } else if (base == 10) { result = num; } else if (base == 16) { result = decToHex(integer) + "." + fractionToBin(fraction); } cout << "转换结果:" << result << endl; return 0; } ``` 该程序可以接受用户输入一个数(包小数)和该数的进制(2、8、10 或 16),并将该数转换成另外三种进制的形式输出。程序还包了将浮点数分成整数和小数部分、小数部分二进制等辅助函数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值