位运算基础

说到与(&)、或(|)、非(~)、异或(^)、位移等位运算,就得说到位运算的各种奇淫巧技,下面分运算符说明。

1. 与(&)

计算式 a&b,a、b各位中同为 1 才为 1,否则为0,a&1和a%2效果一样;来看两道典型的题目,第1道计算整数二进制中 1 的位数:

    //191. Number of 1 Bits
    int hammingWeight(uint32_t n) {
        ;
        ){
            n=n&(n-);
            ++res;
        }
        return res;
    }

n=n&(n-1)代表去掉整数n二进制中最左侧为 1 的位,例如n=12,则:

n    ->
            &
n-  -> 1 0
------------------
        1 0  

第2道判断一个数是否为4的乘方数(不能用loop解):

    //342. Power of Four
    bool isPowerOfFour(int num) {
        if(num==INT_MIN) return false;
        )) && (num&0x55555555);
    }

以上0x55555555的二进制表示为……01010101 (偶数位为0、奇数位为1),像这样tricky的数还有:

 (偶数位为1,奇数位为0)
 (1和0每隔两位交替出现)
 (0和1每隔两位交替出现)
 (1和0每隔四位交替出现)
 (0和1每隔四位交替出现)

相关LeetCode题:

191. Number of 1 Bits  题解

201. Bitwise AND of Numbers Range  题解

 

2. 或(|)

计算式a|b,a、b各位中有一个为1则结果为1;来看一道题:有正整数n,求小于或等于n的2的最大乘方数(不能用loop解):

int largest_power(ing N) {
    N = N | (N>>);
    N = N | (N>>);
    N = N | (N>>);
    N = N | (N>>);
    N = N | (N>>);
    )>>;
}

看起来是不是相当tricky,其思路是用或运算将右边位数置为1,例如n=01010,通过或操作n变为01111,则n+1为10000,所求为01000;更详细解释见 这里

相关LeetCode题:

190. Reverse Bits  题解

3. 异或(^)

计算式a^b,a、b对应位相同为0,相异则为1;根据异或性质有a^a=0,a^0=a,利用该性质可解决136. Single Number:

    //136. Single Number
    int singleNumber(vector<int>& nums) {
        ;
        for(auto x:nums) res^=x;
        return res;
    }

相关LeetCode题:

136. Single Number  题解

461. Hamming Distance  题解

371. Sum of Two Integers  题解

260. Single Number III  题解

 

4. 位移

a<<1效果相当于a*2(不超出数值类型范围情况下),a>>1效果相当于a/2,位移常用于按位轮询。

相关LeetCode题:

405. Convert a Number to Hexadecimal  题解

 
逐位计算结果 

有意思的时当我们的目光放到bit的维度,一些问题可以按位来求解,例如169. Majority Element求数组中出现次数大于一半的数:

    //169. Majority Element
    int majorityElement(vector<int>& nums) {
        ,size=nums.size(),ret=;
        ;i<32;i++){
            ;
            ;j<size;j++){
                if(nums[j]&mask) count++;
                ){
                    ret|=mask;    //逐位计算结果break;
                }
            }
            mask<<=;
        }
        return ret;
    }

相关LeetCode题:

169. Majority Element  题解

421. Maximum XOR of Two Numbers in an Array  题解

使用bit表示数据

在一些场景下我们希望用bit来表示数据,或节省空间或利用bit的运算特性来表示状态转换。

相关LeetCode题:

289. Game of Life  题解

最新文章

  1. javascript中的冒泡排序
  2. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q104-Q106)
  3. javscript处理XML DOM(待续)
  4. 一个字典通过dictionaryWithDictionary 他们的内存指针是不同的
  5. Oracle EBS-SQL (BOM-14):检查工艺路线明细.sql
  6. 采用dlopen、dlsym、dlclose加载动态链接库【总结】
  7. windows cmd 命令大全
  8. 【17-06-16】Java入门测试题,测测你基础知识掌握程度(附答案及个人解析)
  9. [IDE工具配置]myeclipse 2014 专业版 安装 svn插件
  10. .net core入门-发布及部署_异常(处理程序“aspNetCore”在其模块列表中有一个错误模块“AspNetCoreModuleV2&quot;)处理
  11. Programming for Everyone !
  12. PAT 甲级 1083 List Grades (25 分)
  13. 【357】sorted 函数高级用法
  14. java Concurrent包学习笔记(五):Semaphore
  15. Linux 命令安装bin文件
  16. Day 22 面向对象知识.
  17. FastAdmin 无刷新地址改变
  18. Public Bike Management (30)(DFS,VRCTOR,模拟)(PAT甲级)
  19. 使用ADO如何获得SQLSERVER 2K的数据库名的列表
  20. JSONP原理及实现跨域方式

热门文章

  1. Field部分参数设置含义
  2. orm的操作
  3. Tell Don’t Ask
  4. Mac上Ultra Edit的激活
  5. GPS常识-B版(简)
  6. 如何进行高效的源码阅读:以Spring Cache扩展为例带你搞清楚
  7. 【原创】一个shell脚本记录(实现rsync生产文件批量迁移功能)
  8. 通过sparkstreaming分析url的数据
  9. TreeMap原理实现及常用方法
  10. 【原】docker部署单节点consul