Cracking Coding Interview - 16.1 Number Swapper

Number Swapper: Write a function to swap a number in place (that is, without temporary vari­ables).

Hints: #492, #716, #737

解法1

用减法,代码:

1
2
3
4
5
6
7
public void swap() {
  int a = ...;
  int b = ...;
  a = a - b;
  b = b + a;
  a = b - a;
}

解法2

用XOR:

1
2
3
4
5
a        : 00 11 01 00 11
b        : 10 01 01 10 00
c = a ^ b: 10 10 00 10 11
      ^ b: 00 11 01 00 11 == a
      ^ a: 10 01 01 10 00 == b

代码:

1
2
3
4
5
int a = ...;
int b = ...;
a = a ^ b;
b = a ^ b;
a = a ^ b;

关于XOR:对0XOR的结果和原来一样,对1XOR的结果肯定是翻转bit。

第一步flag = a ^ b,得到两者的异同flag,0代表相同,1代表不同。

第二步b = flag ^ b,则是把b中和a相同的部分保留,和a中不同的部分翻转,也就是变成a,最终b彻底变成a。

第三步a = flag ^ b,因为b已经变成了a,那么做的事情就和第二步一样了,把a(由现在的b持有)中和b相同的部分保留,不同的部分翻转,最终彻底变成b。

版权

评论