一、十进制与二进制互转
1. 二进制转十进制
1011010.100101(2)=90.578125(10)
方法一:“按权相加”法
256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | . | 0.5 | 0.25 | 0.125 | 0.0625 | 0.03125 | 0.015625 | 0.0078125 | 0.00390625 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | ◇ | 2-1 | 2-2 | 2-3 | 2-4 | 2-5 | 2-6 | 2-7 | 2-8 |
/ | / | 1 | 0 | 1 | 1 | 0 | 1 | 0 | . | 1 | 0 | 0 | 1 | 0 | 1 | / | / |
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
256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
---|---|---|---|---|---|---|---|---|
✔ | ✔ | ✔ | ✔ | |||||
/ | / | 1 | 0 | 1 | 1 | 0 | 1 | 0 |
0.578125(10)=同上 | ||||||||
90(10)+0.578125(10)=1011010(2)+0.100101(2)=1011010.100101(2) |
二、十进制与八进制互转
十进制 | 32786 | 4096 | 512 | 64 | 8 | 1 | . | 0.125 | 0.015625 |
---|---|---|---|---|---|---|---|---|---|
八进制 | 85 | 84 | 83 | 82 | 81 | 80 | ◇ | 8-1 | 8-2 |
1.十进制转八进制
十进制 | 8 | 16 | 24 | 64 | 128 | 192 | 512 | 4096 | 32768 |
---|---|---|---|---|---|---|---|---|---|
十进制 | 81 | 81×2 | 81×3 | 82 | 82×2 | 82×3 | 83 | 84 | 85 |
八进制 | 10 | 20 | 30 | 100 | 200 | 300 | 1000 | 10000 | 100000 |
方法一:整数部分“除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.十进制转十六进制
十进制 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|
十六进制 | A | B | C | D | E | F |
十进制 | 65536 | 4096 | 256 | 16 | . | 1 | 0.0625 | 0.00390625 |
---|---|---|---|---|---|---|---|---|
十六进制 | 164 | 163 | 162 | 161 | ◇ | 160 | 16-1 | 16-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
四、二进制与八进制互转
二进制 | 八进制 | 二进制 | 十六进制 | |
---|---|---|---|---|
000 | 0 | 0000 | 0 | |
001 | 1 | 0001 | 1 | |
010 | 2 | 0010 | 2 | |
011 | 3 | 0011 | 3 | |
100 | 4 | 0100 | 4 | |
101 | 5 | 0101 | 5 | |
110 | 6 | 0110 | 6 | |
111 | 7 | 0111 | 7 | |
001 000 | 10 | 1000 | 8 | |
001 001 | 11 | 1001 | 9 | |
001 010 | 12 | 1010 | A | |
001 011 | 13 | 1011 | B | |
001 100 | 14 | 1100 | C | |
001 101 | 15 | 1101 | D | |
001 110 | 16 | 1110 | E | |
001 111 | 17 | 1111 | F |
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;
}