我用反向字符串来玩
std::string simpleReverse(std::string inputX) {
//std::string inputX;
std::cout << "Enter a word for revesrse" << std::endl;
std::cout << "You have entered '" << inputX << "'...\nResult is:";
std::string resultA = inputX;
for (int i=inputX.length()-1, j = 0; i>=0, j<5; i--, j++){
//std::cout << inputX[i] << std::endl;
resultA[j] = inputX[i];
}
inputX = resultA;
std::cout << resultA;
它工作正常,但我看到了另一种方法是
string FirstReverse(string str) {
for(int i=0,j=str.length()-1;i<str.length()/2;i++,j--){
str[i]^=str[j]^=str[i]^=str[j];
}
return str;
}
这可以用最短的代码很好地工作,但是我不明白它是如何工作的,我搜索了很多^ =,但是没有得到我想要的答案,它如何工作?
要交换两个值a
和b
,我们可以写:
a = a ^ b;
b = a ^ b;
a = a ^ b;
更多信息,请参见https://en.wikipedia.org/wiki/XOR_swap_algorithm。
该代码正是这种算法,但是写成一行。首先:
a ^= b;
b ^= a;
a ^= b;
然后紧凑。注意,a ^= b
返回新的a
,它代替了b ^= a
,使我们能够写入b ^= a ^= b
。
^表示按位异或它的作用是仅保留同一位置的两个变量的位不同的那些位。
例如,'a'= 100000 1'b'= 10000 1 0a ^ b将为00000 11
现在您的位不同,当您^两个'a'或'b'中的任何一个时,结果将为您提供另一个。
即'a'= 100000 1'a'^'b'= 00000 1110000 1 0 //为您'b'
[通用位将来自'a',并且'a'的不同位将变为0,因此将仅保留'b'的不同位。因此为您提供'b'。
str[i]^=str[j]^=str[i]^=str[j];
为简化此内容:
str[i]^=str[j]; expands to str[i]=str[i]^str[j]; //'a'^'b'
下一步:
str[j]^=str[i]^=str[j]; expands to str[j]=('a'^'b')^'b'//str[j]=str[i] which is 'a' in our case
最后]
str[i]^=str[j]^=str[i]^=str[j]; //'a'^('a'^'b')//str[i]=str[j] which is 'b' in our case
所以它们被交换了。
希望有帮助!