首页 > 其他 > 详细

位运算的巧妙运用

时间:2014-03-15 21:54:08      阅读:612      评论:0      收藏:0      [点我收藏+]

一、异或操作的妙用 

1.使特定位翻转     要使哪几位翻转就将与其进行∧运算的该几位置为1即可。

    如:对111010中间两位取反,则111010^1100=110110

2.与0相∧,保留原值.   即可以把^运算当做不进位的加法,加0,就保持不变

3.交换两个值,不用临时变量.

我们可以在不用引入其他变量就可以实现变量值的交换

用异或操作可以实现:

      a = a^b;          //(1)
      b = a^b;          //(2)
      a = a^b;          //(3)

异或操作满足结合律和交换律,且由异或操作的性质知道,对于任意一个整数a^a=0;

证:(第(2)步中的b)b =a^b = (将第(1)步中的a=a^b代入,得) a^b^b = a^0 = a;

(第(3)步中的a) a = a^b =(将第(1)步中的a=a^b,和上式推出的b=a代入) a^b^a = b;

 

二 、位与运算

1 . 清零      A数中为1的位,B中相应位为0。然后使二者进行&运算,即可达到对A清零目的。

2 . 取一个数中某些指定位 取数A的某些位,把数B的某些位置1,就把数A的某些位与1按位与即可。

3 . 保留一位的方法     数A与数B进行&运算,数B在数A要保留的位1,其余位为零。

4 .  判断奇偶性 将变量 a的奇偶性。a与1做位与&运算,若结果是1(说明a的末位为1),则 a是奇数;将 a与1做位与运算,若结果是0(说明a的末位为0),则 a是偶数。


三、常用实例

1.判断int型变量a是奇数还是偶数     
      

a&1   = 0 偶数
a&1 =   1 奇数

2.取int型变量a的第k位

(k=0,1,2……sizeof(int)),即a>>k&1

3.将int型变量a的第k位清0,即a=a&~(1<<k)

4.将int型变量a的第k位置1, 即a=a|(1<<k)

5.int型变量循环左移k次,即a=a<<k|a>>16-k   (设sizeof(int)=16)

6.int型变量a循环右移k次,即a=a>>k|a<<16-k   (设sizeof(int)=16)

7.整数的平均值

对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会大于INT_MAX

int average(int x, int y)   //返回X,Y 的平均值
{   
     return (x&y)+((x^y)>>1);
}

8.判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂

boolean power2(int x)
{
    return ((x&(x-1))==0)&&(x!=0);
}
另外(x&(x-1))的应用:http://blog.csdn.net/navyifanr/article/details/19496459
9.不用temp交换两个整数
void swap(int x , int y)
{
    x ^= y;
    y ^= x;
    x ^= y;
}

php:
$a =‘dd‘;
$b = ‘bb‘;

$a = $a ^ $b;
$b = $a ^ $b;
$a = $a ^ $b;
echo $a,‘ ‘, $b;


10.计算绝对值
int abs( int x )
{
    int y ;
    y = x >> 31 ;
     return (x^y)-y ;        //or: (x+y)^y
}


11.取模运算转化成位运算 (在不产生溢出的情况下)
         a % (2^n) 等价于 a & (2^n - 1)


12.乘法运算转化成位运算 (在不产生溢出的情况下)
         a * (2^n) 等价于 a<< n

13.除法运算转化成位运算 (在不产生溢出的情况下)
         a / (2^n) 等价于 a>> n
        例: 12/8 == 12>>3

14.a % 2 等价于 a & 1  ( a  & log2(2))      
       a % 4 等价于 a & 2  ( a  & log2(4))  

      .....       
       a % 32 等价于 a & 5


15.
if (x == a) x= b;
    else x= a;
 等价于 x= a ^ b ^ x;

16.x 的 相反数 表示为 (~x+1)


参考或者转自:http://blog.csdn.net/hguisu/article/details/7892596

---EOF---

位运算的巧妙运用,布布扣,bubuko.com

位运算的巧妙运用

原文:http://blog.csdn.net/navyifanr/article/details/21297059

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!