簡體   English   中英

如何在C#中將整數轉換為二進制字符串?

[英]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;
    }

您可以根據第一原理逐位構建表示。

不確定您不想使用哪些內置函數,但想必您可以逐個字符地構造一個字符串?

  1. 從大於數字的 2 的最高冪開始。
  2. 將“1”推入您的字符串中。
  3. 從您的數字中減去 2 的冪。
  4. 取兩個的次低冪。 如果你已經到了一半,就停下來。 你完成了。
  5. 如果剩下的數字大於這個 2 的冪,則返回到第 2 步。如果不是,則將“0”推入字符串並返回到第 4 步。

對於一個的補碼和二進制的補碼,計算那些額外的步驟

還是這種方式對於您的需求來說太基本了?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM