我的字符串反转功能有什么问题? (C#)

时间:2009-04-08 22:32:06

标签: c#

char[] a = { 'o', 'r', 'a', 'n', 'g', 'e' };

for (int i = 0; i < a.Length/2; i++)
{        
  a[i] = (char)(((uint)a[i])|((uint)a[a.Length-(i+1)]));
  a[a.Length-(i+1)] = (char)(((uint)a[i])^((uint)a[a.Length-(i+1)]));
  a[i] = (char)(((uint)a[i])^((uint)a[a.Length-(i+1)]));
}

我知道如何使用标准的.NET功能和临时变量来实现它。我只是好奇我在上面的例子中做错了什么导致它在以下工作正常时不起作用:

int a = 5;
int b = 10;

a = a | b;
b = a ^ b;
a = a ^ b;

上面的字符串版本不仅仅是一系列的吗?

6 个答案:

答案 0 :(得分:6)

呵呵,没有OR / XOR / XOR交换这样的东西 - 它应该是一个“三倍xor”交换。

int a = 8, b = 10;
a ^= b;
b ^= a;
a ^= b;

我不明白你为什么要使用它(除了新奇的价值)

答案 1 :(得分:3)

它不起作用的原因是你使用了一个糟糕的例子。您不能使用OR然后XOR然后XOR交换两个值。它只适用于你的例子,因为5和10没有共同的位,所以第一个OR不会破坏任何信息:

a = 0101 #5
b = 1010 #10
# step 1 (OR into a)
a = 1111
b = 1010
# step 2 (XOR into b)
a = 1111
b = 0101
# step 3 (XOR into a)
a = 1010 #10
b = 0101 #5

但如果他们有任何共同点,它将无法工作 - 让我们试试13和10:

a = 1101 #13
b = 1010 #10
# step 1 (OR into a)
a = 1111
b = 1010
# step 2 (XOR into b)
a = 1111
b = 0101
# step 3 (XOR into a)
a = 1010 #10
b = 0101 #5

请注意,我们现在仍然有值5和10,即使我们从13和10开始。你要找的是三次XOR交换:

a = 1101 #13
b = 1010 #10
# step 1 (XOR into a)
a = 0111
b = 1010
# step 2 (XOR into b)
a = 0111
b = 1101
# step 3 (XOR into a)
a = 1010 # 10
b = 1101 #13

答案 2 :(得分:2)

它具有破坏性(因为按位OR)。为什么不在循环中使用临时变量而不是异或?:

int tmp = a[i];
a[i] = a[a.Length-(i+1)];
a[a.Length-(i+1)] = tmp;

在回答你的第二部分时,你在二进制文件中所做的是:

a = 0101;
b = 1010;
a = 0101 | 1010 === 1111;
...

当您将两个值组合在一起时,会破坏原始数字。它适用于5&amp; 10因为这两个数字之间没有共同的位。使用以下内容执行此操作时:

a = 0110;  // 6 (base ten)
b = 1010;  // 10 (base ten)
a = a | b; // this is now 1110, or 14 (base ten)

你无法再次恢复6和10,因为OR是不可逆转的操作。异或是可逆的。

答案 3 :(得分:1)

很抱歉,如果这不是您的问题,那么如何:

 char[] a = { 'o', 'r', 'a', 'n', 'g', 'e' };
 a = Array.Reverse(a)

我错过了什么吗?

答案 4 :(得分:1)

其他人已经使用XOR操作指出了正确的解决方案......这不是一个答案,但我想我会指出Interlocked.Exchange方法非常适合这类任务。 (它作为原子操作执行交换,因此可以跨线程工作,虽然这似乎与此无关。)尽管如此,我几乎总是认为它是交换两个变量的最简单/最优雅的解决方案。

以下是如何将其与您发布的代码一起使用的示例。

char[] a = { 'o', 'r', 'a', 'n', 'g', 'e' };

for (int i = 0; i < a.Length/2; i++)
{        
    a[a.Length-(i+1)] = Interlocked.Exchange(ref a[a.Length-(i+1)], a[i]);
}

希望有所帮助,即使它不是你问题的具体答案......

答案 5 :(得分:0)

List<char> characters = new List<char>();

characters.AddRange("string".ToCharArray());

characters.Reverse();

string reversed = new string(characters.ToArray());