位运算
位操作基础篇之位操作全面总结 - MoreWindows Blog - 博客频道 - CSDN.NET
http://blog.csdn.net/morewindows/article/details/7354571
总结一下:
1、判断奇偶
数i: if(i&1)printf("%d",i)
2、交换两数
数a,b: a^=b;
b^=a;
a^=b; //^运算符具有交换律
注意:a和b 相等和任一者为负数都可以!!但如果用一个数a和a则会出现错误
3、变换符号:
正数变负数,负数变正数
~a+1 //~是取反运算符
4、取绝对值
数a:
int i=a>>31;
return ((a^i)-i);
5、空间压缩
在数组指定位置上写1(相当于判断true)
int b[5]={0};
for(int i=0;i<40;i+=3)
b[i/32] |=(1<<(i%32));
判断某位上是否是1
for(int i=0;i<40;i++)
if((b[i/32] >>(i%32))&1) putchar('1');
6、高低位交换
int a;
a=(a>>8)|(a<<8);
7、二进制逆序
int a=2343;
a=((a&0xAAAA)>>1)|((a&0x5555)<<1);
a=((a&0xCCCC)>>2)|((a&0x3333)<<2);
a=((a&0xF0F0)>>4)|((a&0x0F0F)<<4);
a=((a&0xFF00)>>8)|((a&0x00FF)<<8);
8、二进制中1的个数
int a=243;
a=((a&0xAAAA)>>1)+(a&0x5555);
a=((a&0xCCCC)>>2)+(a&0x3333);
a=((a&0xF0F0)>>4)+(a&0x0F0F);
a=((a&0xFF00)>>8)+(a&0x00FF);
还有一种做法:int i=0;
while(n)
{ ++i; n=(n-1)&n;} // i 就是n 的1 的个数
9、缺失的数字
int a[7]={1,2,3,4,3,4,2};
int lost=0;
for(int i=0;i<lost;i++)
lost^=a[i];