位运算

位操作基础篇之位操作全面总结 - 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];

posted on 2016-03-17 09:24  RenewDo  阅读(160)  评论(0编辑  收藏  举报

导航