刚做一个数据结构第一单元的一个题目,是为了实现某个字符的全排列。在网上找了一些代码,然后运行正确,但是对里面字符和字符的异或问题不是很了解,代码如下,其中str[low] ^= str[i]后,str[low]的存放的字符不清楚是什么???
public class GetChar {
public void permute01(String str){
permute(str.toCharArray(),0,str.length()-1);
}
private void permute(char [] str, int low, int high){
if(low == high)System.out.println(str);
for(int i = low;i<=high;i++){
if(i > low)
{
str[low] ^= str[i];
str[i] ^= str[low];
str[low] ^= str[i];
}
permute(str, low + 1, high);
if(i > low){
str[low] ^= str[i];
str[i] ^= str[low];
str[low] ^= str[i];
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "abc";
new GetChar().permute01(str);
}
}
------解决思路----------------------
str[low] ^= str[i];
str[i] ^= str[low];
str[low] ^= str[i];
只知道这样可以实现str[low] 和 str[i]的交换,楼主实在想知道值的话就在str[low] ^= str[i];后面打印str[low]的值吧
------解决思路----------------------
str[low] ^= str[i];
str[i] ^= str[low];
str[low] ^= str[i];
相当于:
char temp = str[low];
str[low] = str[i];
str[i] = temp;
这个就是字符交换。
假设某个循环时 str[low] = 'a', str[i] = 'b', ‘a’的整数形式是97,二进制形式是01100001,‘b’的整数形式是98,二进制形式是01100010.
1 执行str[low] ^= str[i]; 相当于 str[low] = str[low] ^str[i] ,即 str[low] = 01100001 ^ 01100010 = 00000011. 这是个临时值。
2 执行str[i] ^= str[low]; 相当于 str[i] = str[i] ^ str[low], 即 str[i] = 01100010 ^ 00000011 = 01100001. 这句相当于把'a' 赋值给了str[i].
3 执行 str[low] ^= str[i]; 相当于 str[low] = str[low] ^ str[i] 即 str[low] = 00000011 ^ 01100001 = 01100010, 这句就是把 'b' 赋值给了str[low] .
就完成了字符交换。
------解决思路----------------------
正解哦,棒!