2013-09-23 19 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的檢查[B]你需要它比較反對「0」和「1」而不是數字0和1

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

也有另一種錯誤,使用替換更改全部字符串中指定字符的出現,但我們只想更改指定位置處的指定字符。 C#沒有replaceAt,但可以創建一個輔助函數來執行此操作。見Replacing a char at a given index in string?。我用喬恩斯基特的代碼在這裏:

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);