百度的一道题
用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。
char *revert(char * str)
{
int n=strlen(str);
char* s = str;
char* e = p+n-1;
while( s < e )
{
  *s ^= *e;
  *e ^= *s;
  *s ^= *e;
  s++,e--;
}
return str;
}

看到 ^= 我就郁闷了,我怎么不记得我学过这东西
原来这叫位异或

int a = 12 = 1100;
int b = 6  = 0110;

a ^b     = 1010;
a ^ b ^a = 1010 ^ 1100 = 0110 = 6 = b;
a ^ b ^b = 1010 ^ 0110 = 1100 = 12 = a;

原来,异或运算符的特点是:两次异或同一个数,仍然为原值.
所以,通过位异或运算,可以实现两个值的交换,而不必使用临时变量。


以下是一些常用的位运算的技巧。

 求浮点数的绝对值

double abs(double y)
{
 double x = y;
*(((int *) &x) + 1) &= 0x7fffffff;//0x7fffffff换成二进制是31个1
 return x;
}

 整数的平均值

对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:
AVE(x,y) 
{
return ((x)&(y))+(((x)^(y))>>1)
}

就是把x和y都分成两部分, 
一部分是都为‘1’的部分,因为相同,所以直接加就行了 
一部分是x为‘1’,y为‘0’的部分,以及y为’1‘,x为’0‘的部分,两部分加起来除以2,然后跟前面的相加就可以了

判断一个整数是不是2的幂

对于一个数 x >= 0,判断他是不是2的幂
#define POWER2(x) (((x&(x-1))==0)&&((x)!=0))
如果1个数是2的n次幂,则其比为1000...0(n个0),减1,为1...1(n个1)取与,值为0