位运算小结

一、简介

  1 它们都是双目运算符,两个运算分量都是整形,结果也是整形。
  2 "<<" 左移:右边空出的位上补0,左边的位将从字头挤掉,其值相当于乘2。
  3 ">>"右移:右边的位被挤掉。对于左边移出的空位,如果是正数则空位补0,若为负数,可能补0或补1,这取决于所用的计算机系统。
  4 ">>>"运算符,右边的位被挤掉,对于左边移出的空位一概补上0。

二、常用方法(n为被操作数,k为操作数)

  1、按位与 &

    清零特定位----n=n&k (k的指定位为0,其他位为1)

    取某数中指定位 -- n=n&k(k的指定位为1,其他位为0)

  2、按位或  |

    将n的某一位置为1,n=n | k 。(k的指定位为0,其他位为1)

  3、位异或  ^

    指定位的值取反 n = n^k 。(k的指定位为1,其他位为0)

    实现两个数的交换,不使用第三个变量

        a = a ^ b ;   b = b ^ a ;   a = a ^ b

三、应用举例

  1、计算一个数的二进制中1的个数(可以参见鄙人以前的博客

/*
    计算一个数的二进制中1的个数
*/
int countOf1(int num)
{
    int count = 0;

    while(num)
    {
        num = num & (num - 1);
        count++;
    }
    return count;
}

  2、判断一个数是否是2的n次方

 1 /*
 2     判断一个数是否为2的n次方(一个数为2的n次方,则最高位为1,其余位为0)
 3 */
 4 bool is2Power(int num)
 5 {
 6     bool flag = true;
 7 
 8     num = num & (num - 1); //计算num和num - 1的与的结果
 9     if(num) //如果结果为0,则不是2的n次方
10     {
11         flag = false;
12     }
13     
14     return flag;
15 }

  上面代码找个例子可以很容易的发现,也可以参见上面的链接。

3、获得最大的int值

int getMaxInt()  
{  
    return (1 << 31) - 1;  
} 

4、获得最小的int值

int getMaxInt()  
{  
    return (1 << 31);  
} 

5、判断一个数的奇偶性

    /* 
        判断一个数的奇偶性.返回1,为奇数;返回0,为偶数 
    */  
    bool isOdd(int num)  
    {  
        return num & 1 == 1;  
    }  

6、交换两个数(不借助第三变量)如上

/*
    不适用临时变量,交换两个数
    a = a ^ b
    b = b ^ a
    a = a ^ b

或者
       a = a + b
       b = a - b
       a = a - b    
    
*/
void swap(int* a,int* b)
{
    (*a) ^= (*b) ^= (*a) ^= (*b);
}

  

原文地址:https://www.cnblogs.com/plxx/p/4702955.html