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。我哪里出错了?

4

2 回答 2

1

当您检查 u2_number_minus[b] 时,您需要将其与“0”和“1”进行比较,而不是数字 0 和 1。

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

还有一个错误,使用 Replace 会更改字符串中所有出现的指定字符,但我们只想更改指定位置的那个。C# 没有 replaceAt,但可以创建一个辅助函数来执行此操作。请参阅替换字符串中给定索引处的字符?. 我在这里使用了 Jon Skeet 的代码:

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

并更改 Replace 行以使用 ReplaceAt 例如

u2_number_minus = u2_number_minus.ReplaceAt(b, '1');
于 2013-09-23T11:54:43.397 回答
-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);
于 2013-09-23T12:18:51.183 回答