华为面试题解析 - 04

2014-11-24 02:27:45 · 作者: · 浏览: 1
04. 交换两个变量的值,不使用第三个变量
我们知道,如果当进行按位操作的时候可以使用两个变量。
而此题正可以应用异或操作来完成。
数学公式:
a b = ( a ∧ b) ∨ (a ∧ b)
伪代码:
a xor b = (~a and b) or (a and ~b)
C代码:
[cpp]
a ^ b = ((~a) & b) | (a & (~b));
[cpp] view plaincopy
b ^ a = ((~b) & a) | (b & (~a));
那么,b = ((~b) & ((~a) & b) | (a & (~b))) | (b & (~(((~a) & b) | (a & (~b)))));
a = ((~a) & ((~b) & a) | (b & (~a))) | (a & (~((~b) & a) | (b & (~a))));
实现代码:
[cpp]
/*
* exercise02.c
*
* Created on: 2012-11-5
* Author: xiaobin
*
* Huawei face questions
*/
#include
int main(int argc, char* argv[])
{
int a, b;
a = 10;
b = 20;
// a = ((~a) & b) | (a & (~b));
// b = ((~b) & a) | (b & (~a));
a ^= b;
printf("a = %d b = %d\n", a, b);
b ^= a;
printf("a = %d b = %d\n", a, b);
a ^= b;
printf("a = %d b = %d\n", a, b);
return 0;
}