2016-10-03 2 views
0

У меня есть код, который превращает целое число в его двоичное представление, но мне было интересно, есть ли более простой или «простой» способ сделать это. Я знаю, что в C# есть встроенный метод, который делает это для вас автоматически, но это не то, что я хочу использовать.C# Более простой способ преобразования целого числа в строку в двоичной форме без метода Convert.ToString.?

Эта версия пересекает каждый из 32-разрядных позиций при записи и нулях и использует TrimStart для удаления ведущих нулей.

Например, преобразование целого числа 10 в его строковое представление в двоичном формате как «1010».

static string IntToBinary(int n) 
{ 
    char[] b = new char[32]; 
    int pos = 31; 
    int i = 0; 

    while (i < 32) // Loops over each of the 32-bit positions while writing ones and zeros. 
    { 
     if ((n & (1 << i)) != 0) 
     { 
      b[pos] = '1'; 
     } 
     else 
     { 
      b[pos] = '0'; 
     } 
     pos--; 
     i++; 
    } 
    return new string(b).TrimStart('0'); // TrimStart removes leading zeroes. 
} 

static void Main() 
{ 
    Console.WriteLine(IntToBinary(300)); 
} 
+0

** Почему ** вы не хотите использовать 'Con vert.ToString'? –

ответ

0

Я полагаю, вы могли бы использовать ПОЛУБАЙТОМ таблицы поиска:

static string[] nibbles = { 
    "0000", "0001", "0010", "0011", 
    "0100", "0101", "0110", "0111", 
    "1000", "1001", "1010", "1011", 
    "1100", "1101", "1110", "1111" 
}; 

public static string IntToBinary(int n) 
{ 
    return 
     nibbles[(n >> 28) & 0xF] + 
     nibbles[(n >> 24) & 0xF] + 
     nibbles[(n >> 20) & 0xF] + 
     nibbles[(n >> 16) & 0xF] + 
     nibbles[(n >> 12) & 0xF] + 
     nibbles[(n >> 8) & 0xF] + 
     nibbles[(n >> 4) & 0xF] + 
     nibbles[(n >> 0) & 0xF] 
    .TrimStart('0'); 
} 
+0

Это кажется более сложным, но простым, когда вы понимаете логику. – Jared

0

Вот простая реализация LINQ:

static string IntToBinary(int n) 
{ 
    return string.Concat(Enumerable.Range(0, 32) 
     .Select(i => (n & (1 << (31 - i))) != 0 ? '1' : '0') 
     .SkipWhile(ch => ch == '0')); 
} 

Еще один используя for цикл:

static string IntToBinary(int n) 
{ 
    var chars = new char[32]; 
    int start = chars.Length; 
    for (uint bits = (uint)n; bits != 0; bits >>= 1) 
     chars[--start] = (char)('0' + (bits & 1)); 
    return new string(chars, start, chars.Length - start); 
} 
Смежные вопросы