[英]How to convert integer to binary string in C#?
我正在寫一個數字轉換器。 如何在不使用內置函數的情況下在 C# 中將整數轉換為二進制字符串( Convert.ToString
根據給定的值執行不同的操作)?
簡單的方法:
IntToBinValue = Convert.ToString(6, 2);
現在幾乎所有的計算機都在內部使用二進制補碼表示,因此如果您進行這樣的直接轉換,您將得到二進制補碼字符串:
public string Convert(int x) {
char[] bits = new char[32];
int i = 0;
while (x != 0) {
bits[i++] = (x & 1) == 1 ? '1' : '0';
x >>= 1;
}
Array.Reverse(bits, 0, i);
return new string(bits);
}
這是您進行其余兩次轉換的基礎。 對於符號幅度,只需預先提取符號並轉換絕對值:
byte sign;
if (x < 0) {
sign = '1';
x = -x;
} else {
sign = '0';
}
string magnitude = Convert(x);
對於補碼,如果數字為負,則減一:
if (x < 0)
x--;
string onec = Convert(x);
至少部分答案是使用decimal.GetBits(someValue)
將十進制轉換為其二進制表示。
反過來, BitConverter.GetBytes
可用於從decimal.GetBits()
返回的元素decimal.GetBits()
整數轉換為字節。
您可能會發現decimal.GetBits()
文檔很有用。
不過,我不確定如何從字節轉換為十進制。
更新:基於作者的更新:
BitConverter
包含將數字轉換為字節的方法,便於獲取二進制表示。 GetBytes()
和ToInt32()
方法便於在每個方向上進行轉換。 ToString()
重載對於創建十六進制字符串表示很方便,如果您發現它更容易解釋為 1 和 0。
var a = Convert.ToString(4, 2).PadLeft(8, '0');
這是我的:(上半部分將 32 位二進制字符串轉換為 32 位整數,下半部分將 32 位整數轉換回 32 位二進制字符串)。 希望這會有所幫助。
string binaryString = "011100100111001001110011";
int G = 0;
for (int i = 0; i < binaryString.Length; i++)
G += (int)((binaryString[binaryString.Length - (i + 1)] & 1) << (i % 32));
Console.WriteLine(G); //7500403
binaryString = string.Empty;
for (int i = 31; i >= 0; i--)
{
binaryString += (char)(((G & (1 << (i % 32))) >> (i % 32)) | 48);
}
Console.WriteLine(binaryString); //00000000011100100111001001110011
這是一個優雅的解決方案:
// Convert Integer to binary and return as string
private static string GetBinaryString(Int32 n)
{
char[] b = new char[sizeof(Int32) * 8];
for (int i = 0; i < b.Length; i++)
b[b.Length-1 - i] = ((n & (1 << i)) != 0) ? '1' : '0';
return new string(b).TrimStart('0');
}
這是一個不安全的實現:
private static unsafe byte[] GetDecimalBytes(decimal d)
{
byte* dp = (byte*) &d;
byte[] result = new byte[sizeof(decimal)];
for (int i = 0; i < sizeof(decimal); i++, dp++)
{
result[i] = *dp;
}
return result;
}
這是回歸:
private static unsafe decimal GetDecimal(Byte[] bytes)
{
if (bytes == null)
throw new ArgumentNullException("bytes");
if (bytes.Length != sizeof(decimal))
throw new ArgumentOutOfRangeException("bytes", "length must be 16");
decimal d = 0;
byte* dp = (byte*)&d;
byte[] result = new byte[sizeof(decimal)];
for (int i = 0; i < sizeof(decimal); i++, dp++)
{
*dp = bytes[i];
}
return d;
}
您可以根據第一原理逐位構建表示。
不確定您不想使用哪些內置函數,但想必您可以逐個字符地構造一個字符串?
對於一個的補碼和二進制的補碼,計算那些額外的步驟。
還是這種方式對於您的需求來說太基本了?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.