位运算小结

it2022-05-28  59

一、简介

  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


最新回复(0)