2013-09-23 2 views
1

У меня есть двоичное число, и мне нужно:Отрицание и увеличение значения в двоичной системе

1) свести на нет все байты

2) добавить 1 к отрицанию номер

Итак, я написал :

public string u2_number_plus = "1001"; 
public string u2_number_minus = ""; 

public string binToU2() 
     { 
      int length = u2_number_plus.Length; 
      int temp = 1; 

      //negate all bytes 
      for (int a = 0; a < length; a++) 
      { 
       if (u2_number_plus[a] == '1') 
        u2_number_minus += '0'; 
       else 
        u2_number_minus += '1'; 
      } 

      //add 1 to my new (because negate) number 
      for (int b = length - 1; b >= 0; b--) 
      { 
       if (u2_number_minus[b] == 0 && temp == 1) 
       { 
        u2_number_minus = u2_number_minus.Replace(u2_number_minus[b], '1'); 
        temp = 0; 
       } 
       else if (u2_number_minus[b] == 1 && temp == 1) 
       { 
        u2_number_minus = u2_number_minus.Replace(u2_number_minus[b], '0'); 
        temp = 1; 
       } 
       else 
        break; 
      } 

      return u2_number_minus; 
     } 

Моя функция binToU2() возвращает отрицание, но не значение приращения. Если входные данные 1001, я должен получить 0111, но функция возвращает только 0110. Где я сделал ошибку?

ответ

1

Когда вы делаете проверку u2_number_minus [б] вы должны сравнить его с «0» и «1» не число 0 и 1.

if (u2_number_minus[b] == '0' && temp == 1) 

Существует также другая ошибка, использование из Заменить изменения все вхождения указанного символа в строке, но мы хотим только изменить его в указанной позиции. C# не имеет replaceAt, но для этого может быть создана вспомогательная функция. См. Replacing a char at a given index in string?. Я использовал код Jon тарелочкам здесь:

public static class ReplaceHelper 
{ 
public static string ReplaceAt(this string input, int index, char newChar) 
    { 
    if (input == null) 
    { 
     throw new ArgumentNullException("input"); 
    } 
    char[] chars = input.ToCharArray(); 
    chars[index] = newChar; 
    return new string(chars); 
    } 
} 

и изменить Заменить строки использовать ReplaceAt например

u2_number_minus = u2_number_minus.ReplaceAt(b, '1'); 
+0

Да, вы правы, но теперь функция преобразует все число в 1111. Есть ли логическая ошибка или код еще недостаточно? –

+1

Я обновил код, теперь он корректно работает –

+0

Спасибо, проблема решена. –

-1

действительно не получить то, что вы хотите сделать, или там, где вам это нужно для, но в любом случае, возможно, вы хотите использовать BitArray вместо того, чтобы бороться со строковыми манипуляциями.

BitArray фактически хранения битов и предоставляет основные функциональные возможности свести на нет массив или использовать другие операции ...

Позвольте мне дать вам пример:

 // define a bit array with length=4 and false as default value for each bit. 
     var bits = new BitArray(4, false); 

     bits.Not(); // negate --> all 4 bits are now true. 

     // your example: 
     bits = new BitArray(new bool[] { true, false, false, true }); 
     // to inverst/negate it 
     bits.Not(); 

     // convert to string: 
     string bitString = string.Empty; 
     foreach (var bit in bits) 
     { 
      bitString += (bool)bit ? "1" : "0"; 
     } 

     Console.WriteLine(bitString); 

     // from string: 
     string longBitString = "01000101001001010100010010010"; 
     var longIntArray = longBitString.ToCharArray().Select(p => p.Equals('0') ? false : true).ToArray(); 
     var longBitArray = new BitArray(longIntArray); 
Смежные вопросы