【发布时间】:2022-01-14 20:40:51
【问题描述】:
如何将二进制字符串(例如1001101)转换为十进制? (77)
【问题讨论】:
如何将二进制字符串(例如1001101)转换为十进制? (77)
【问题讨论】:
Convert.ToInt32 方法有一个overload that accepts a base parameter。
Convert.ToInt32("1001101", 2).ToString();
【讨论】:
看看这个非常相似但处理十六进制How to convert numbers between hexadecimal and decimal in C#?的问题
Convert.ToInt64(value, 2)
【讨论】:
如果您采用手动方式而不是使用内置 C# 库,则可以这样做:
static int BinaryToDec(string input)
{
char[] array = input.ToCharArray();
// Reverse since 16-8-4-2-1 not 1-2-4-8-16.
Array.Reverse(array);
/*
* [0] = 1
* [1] = 2
* [2] = 4
* etc
*/
int sum = 0;
for(int i = 0; i < array.Length; i++)
{
if (array[i] == '1')
{
// Method uses raising 2 to the power of the index.
if (i == 0)
{
sum += 1;
}
else
{
sum += (int)Math.Pow(2, i);
}
}
}
return sum;
}
【讨论】:
Math.Pow(2, 0) 为 1,因此不需要 if 会减慢速度。
if 不会减慢它的速度。它甚至可以加快速度。 Math.Pow 比简单的 if 和 int == int 慢得多。但是,Math.Pow(2, x) 通常会受到大量编译器优化,因为它的结果等于1 << x。在这种情况下,将单个结果加在一起是一种浪费。最好是 binary or 下一个 1 并向右移动。
string s=Console.ReadLine();
int b=Convert.ToInt32(s,2);
Console.WriteLine("Input value in base 10 = "+b);
将任何二进制转换为十进制。 :)
【讨论】:
使用binary or 和shift 将binary string 转换为uint 的手动方法可能是:
public static uint ConvertBinaryStringToUInt32(string binaryString)
{
if (binaryString is null)
{
throw new ArgumentNullException(nameof(binaryString));
}
if (binaryString.Length > 32)
{
throw new ArgumentOutOfRangeException(nameof(binaryString), binaryString.Length, "The specified binary string can not be longer than 32 characters.");
}
uint result = 0u;
for (int i = 0; i < binaryString.Length; i++)
{
result <<= 1;
char c = binaryString[i];
if (c == '0')
{
}
else if (c == '1')
{
result |= 1u;
}
else
{
throw new FormatException($"Character {i} of binary string \"{binaryString}\" is an invalid '{c}'. Can only be '0' or '1'.");
}
}
return result;
}
【讨论】:
我想要一个解决方案,无论数字大小,始终提供 32 位。所以这就是我创造的。
public static string ConvertUintToBitString(uint Number)
{
string _BitString = string.Empty;
if (Number >= 2147483648)
{
_BitString += '1';
Number = Number - 2147483648;
}
else
{
_BitString += '0';
}
if (Number >= 1073741824)
{
_BitString += '1';
Number = Number - 1073741824;
}
else
{
_BitString += '0';
}
if (Number >= 536870912)
{
_BitString += '1';
Number = Number - 536870912;
}
else
{
_BitString += '0';
}
if (Number >= 268435456)
{
_BitString += '1';
Number = Number - 268435456;
}
else
{
_BitString += '0';
}
if (Number >= 134217728)
{
_BitString += '1';
Number = Number - 134217728;
}
else
{
_BitString += '0';
}
if (Number >= 67108864)
{
_BitString += '1';
Number = Number - 67108864;
}
else
{
_BitString += '0';
}
if (Number >= 33554432)
{
_BitString += '1';
Number = Number - 33554432;
}
else
{
_BitString += '0';
}
if (Number >= 16777216)
{
_BitString += '1';
Number = Number - 16777216;
}
else
{
_BitString += '0';
}
if (Number >= 8388608)
{
_BitString += '1';
Number = Number - 8388608;
}
else
{
_BitString += '0';
}
if (Number >= 4194304)
{
_BitString += '1';
Number = Number - 4194304;
}
else
{
_BitString += '0';
}
if (Number >= 2097152)
{
_BitString += '1';
Number = Number - 2097152;
}
else
{
_BitString += '0';
}
if (Number >= 1048576)
{
_BitString += '1';
Number = Number - 1048576;
}
else
{
_BitString += '0';
}
if (Number >= 524288)
{
_BitString += '1';
Number = Number - 524288;
}
else
{
_BitString += '0';
}
if (Number >= 262144)
{
_BitString += '1';
Number = Number - 262144;
}
else
{
_BitString += '0';
}
if (Number >= 131072)
{
_BitString += '1';
Number = Number - 131072;
}
else
{
_BitString += '0';
}
if (Number >= 65536)
{
_BitString += '1';
Number = Number - 65536;
}
else
{
_BitString += '0';
}
if (Number >= 32768)
{
_BitString += '1';
Number = Number - 32768;
}
else
{
_BitString += '0';
}
if (Number >= 16384)
{
_BitString += '1';
Number = Number - 16384;
}
else
{
_BitString += '0';
}
if (Number >= 8192)
{
_BitString += '1';
Number = Number - 8192;
}
else
{
_BitString += '0';
}
if (Number >= 4096)
{
_BitString += '1';
Number = Number - 4096;
}
else
{
_BitString += '0';
}
if (Number >= 2048)
{
_BitString += '1';
Number = Number - 2048;
}
else
{
_BitString += '0';
}
if (Number >= 1024)
{
_BitString += '1';
Number = Number - 1024;
}
else
{
_BitString += '0';
}
if (Number >= 512)
{
_BitString += '1';
Number = Number - 512;
}
else
{
_BitString += '0';
}
if (Number >= 256)
{
_BitString += '1';
Number = Number - 256;
}
else
{
_BitString += '0';
}
if (Number >= 128)
{
_BitString += '1';
Number = Number - 128;
}
else
{
_BitString += '0';
}
if (Number >= 64)
{
_BitString += '1';
Number = Number - 64;
}
else
{
_BitString += '0';
}
if (Number >= 32)
{
_BitString += '1';
Number = Number - 32;
}
else
{
_BitString += '0';
}
if (Number >= 16)
{
_BitString += '1';
Number = Number - 16;
}
else
{
_BitString += '0';
}
if (Number >= 8)
{
_BitString += '1';
Number = Number - 8;
}
else
{
_BitString += '0';
}
if (Number >= 4)
{
_BitString += '1';
Number = Number - 4;
}
else
{
_BitString += '0';
}
if (Number >= 2)
{
_BitString += '1';
Number = Number - 2;
}
else
{
_BitString += '0';
}
if (Number == 1)
{
_BitString += '1';
}
else
{
_BitString += '0';
}
return _BitString;
}
【讨论】:
我在阅读您的问题后尝试了这个。它有点长,但它提供了一个解决方案。我将二进制元素保存在数组中以获得解决方案。就像我说的,它有点长,可以找到更短的方法。
// Binary ------> Decimal
int len;
double deci = 0;
Console.Write("Length of binary number: ");
len = Convert.ToInt32(Console.ReadLine());
int[] bnry = new int[len];
for (int i = 0; i < len; i++)
{
Console.Write("{0} index of binary number: ", i);
bnry[i] = Convert.ToInt32(Console.ReadLine());
}
Console.Write("Your binary number: ");
for (int i = len - 1; 0 <= i; i--)
{
Console.Write(bnry[i]);
}
Console.Write("\nDecimal number: ");
for (int i = 0; i < len; i++)
{
deci += (bnry[i] * Math.Pow(2, i));
}
Console.Write(deci);
【讨论】:
我刚刚做了另一种手动方式
private int binary2Decimal(string bin)
{
int res;
char[] cArr = bin.ToCharArray();
Array.Reverse(cArr); // Reverse binary string
List<int> iArr = new List<int>();
for (int i = bin.Length - 1; i > -1; i--) // Get the bits
iArr.Add(Int16.Parse(cArr[i].ToString()) * (int)Math.Pow(2, i)); // Calculate each bits and add to an array
res = iArr.ToArray().Sum(); // Calculate all the numbers and add to the final result
return res;
}
【讨论】:
public static int ToDecimal(int n) //1110
{
int result = 0;
var number = n.ToString().ToCharArray();
var dic = new Dictionary<int, string>();
var len = number.Length - 1;
for (int i = 0; i < number.Length && len >= 0; i++)
{
dic.Add(i, number[len--].ToString());
}
foreach (var item in dic)
{
if(Convert.ToInt32(item.Value) > 0 )
{
result = result + Convert.ToInt32(Math.Pow(2, item.Key));
}
}
return result;
}
【讨论】:
这应该可行
static int binaryToDecimal(string input) {
int result = 0;
for (int i = input.Length; i > 0 ; i--)
if (input.Substring(i-1,1) == "1")
result += (int)Math.Pow(2,(input.Length-i));
return result;
}
【讨论】:
// 1. In the first method we will use parseInt() function to convert binary to decimal..
let binaryDigit = 11011; let getDecimal = parseInt(binaryDigit, 2);
console.log(getDecimal);
<!-- begin snippet: js hide: false console: true babel: false -->
【讨论】: