一、 运算符

  • & 与运算: 两个位都是 1 时,结果才为 1,否则为 0
  • | 或运算: 两个位都是 0 时,结果才为 0,否则为 1
  • ^ 异或运算: 两个位相同则为 0,不同则为 1
  • ~ 取反运算:0 则变为 1,1 则变为 0
  • << 左移运算:向左进行移位操作,高位丢弃,低位补 0 (每左移一位相当于乘一次2)
  • >> 右移运算:向右进行移位操作,对无符号数,高位补 0,对于有符号数,高位补符号位 (每右移一位相当于除一次2)

二、 应用场景

^ 异或运算性质:

(1)交换律

(2)结合律(即(a^b)^c == a^(b^c))

(3)对于任何数x,都有x^x=0,x^0=x

(4)自反性 A ^ B ^ B = A ^ 0 = A

常见应用

  • 与运算的应用:(1)清零。如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。 (2)取一个数中指定位
  • 或运算的应用: 对一个数的某几位补1
  • 异或运算的应用: 消去一对重复的数(利用上面), 交换变量等等。
  • 取模: 位运算比加减乘除更加高效。 所以在一些底层的组件例如jdk, redis 中经常用位运算,比如用<< ,>>代替乘除, 用& 代替取模操作。
  • 状态压缩和位图: 位运算可以用压缩存储和表示信息。 每个二进制位有0|1 两种状态, 那一个int32 可以表示出 32种状态。 比如linux中的文件状态中的read ,write, 和执行权限就可以用三个二进制位表示, 7(111)表示有Read的权限,有Write的权限和执行的权限。

三、 例题

1、 不使用中间变量交换两数

// 思路: 利用上面提到的异或的结合率 和自反率
// a = (a ^ b) ^ b , b = a ^ b ^ a
void swap(int &a, int &b) {a ^= b;b ^= a;a ^= b;
}

2、 数组中,只有一个数出现一次,剩下都出现两次,找出出现一次的数 (leetcode - 136)

    public int singleNumber(int[] nums) {int res = 0;for(int i = 0; i < nums.length; i++) {res = res ^ nums[i];}return res;}

3、 用 O(1) 时间检测整数 n 是否是 2 的幂次 (LintCode - 142)

/** 思路: 常用技巧:n&(n-1)消去n 的二进制最后一位的1
* 比如3&(3-1) = (11)&(10) = (10) ,
* 如果是2的幂次, 那二进制形式下只有一位是1, 消去后为0
*/    public boolean checkPowerOf2(int n) {if(n <= 0) return false;return (n & (n - 1)) == 0;}

4、子集列举 (leetcode - 78 medium)

描述:

Given a set of distinct integers, nums, return all possible subsets (the power set).

Note: The solution set must not contain duplicate subsets.

Example:

Input: nums = [1,2,3]
Output:
[[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[]
]

思路:(这道题递归做感觉也很容易理解)

注意数组中数字唯一,可以把这道题理解成高中数学中的排列组合问题。每个数字有取或不取两种可能性, n个数有2的n次方个子集。 可以用一个正整数二进制表示的第i位是1还是0,代表集合的第i个数取或者不取。类似下图:

0 000 {}
1 001 {1}
2 010 {2}
3 011 {1,2}
4 100 {3}
5 101 {1,3}
6 110 {2,3}
7 111 {1,2,3}

A:

    vector<vector<int>> subsets(vector<int>& nums) {int n = nums.size()int p = 1 << n;vector<vector<int>> subs(p);for (int i = 0; i < p; i++) {for (int j = 0; j < n; j++) {// 用 i>>j & 1的方式遍历每一位if ((i >> j) & 1) {subs[i].push_back(nums[j]);}}}return subs;}

5、 位图

描述:有一千万个整数,整数范围在1到1亿之间, 如何快速查找某个整数是否在这1千万个整数中。

思路: 用一个bit 数组来存储这1-1亿之间的数。如果数字存在, 在对应的下标上标1, 1亿个数只需要1亿个bit位。

public class BitMap { // Java 中 char 类型占 16bit,也即是 2 个字节private char[] bytes;private int nbits;public BitMap(int nbits) {this.nbits = nbits;this.bytes = new char[nbits/16+1];}public void set(int k) {if (k > nbits) return;int byteIndex = k / 16;int bitIndex = k % 16;bytes[byteIndex] |= (1 << bitIndex);}public boolean get(int k) {if (k > nbits) return false;int byteIndex = k / 16;int bitIndex = k % 16;return (bytes[byteIndex] & (1 << bitIndex)) != 0;}
}

生成n套数位加减乘除_leetcode 算法汇总(四)位运算相关推荐

  1. 获取序列全排列Java,java中全排列的生成算法汇总

    全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来.任何n个字符集的排列都可以与1-n的n个数字的排列一一对应, 因此在此就以n个数字的排列为例说明排列的生成法 ...

  2. 终于,把十大经典排序算法汇总了!(Java实现版)

    转载自  终于,把十大经典排序算法汇总了!(Java实现版) 最近几天在研究排序算法,看了很多博客,发现网上有的文章中对排序算法解释的并不是很透彻,而且有很多代码都是错误的,例如有的文章中在" ...

  3. 常用机器学习算法汇总比较(完)

    机器学习入门系列(2)–如何构建一个完整的机器学习项目,第九篇! 该系列的前八篇文章: 机器学习入门系列(2)–如何构建一个完整的机器学习项目(一) 机器学习数据集的获取和测试集的构建方法 特征工程之 ...

  4. 常用机器学习算法汇总(中)

    机器学习入门系列(2)–如何构建一个完整的机器学习项目,第八篇! 该系列的前七篇文章: 机器学习入门系列(2)–如何构建一个完整的机器学习项目(一) 机器学习数据集的获取和测试集的构建方法 特征工程之 ...

  5. 面试10大算法汇总+常见题目解答

    http://www.programcreek.com/2012/12/%E9%9D%A2%E8%AF%9510%E5%A4%A7%E7%AE%97%E6%B3%95%E6%B1%87%E6%80%B ...

  6. mask rcnn算法分析_实例分割综述(单阶段/两阶段/实时分割算法汇总)

    作者:Danny明泽 来源:公众号@3D视觉工坊 链接:实例分割综述(单阶段/两阶段/实时分割算法汇总) 简介 目标检测或定位是数字图像从粗到细的一个渐进过程.它不仅提供了图像对象的类,还提供了已分类 ...

  7. 常用机器学习算法汇总

    常用机器学习算法汇总 从一个项目的终极目标.寻找和获取数据,到数据预处理,做特征工程,接下来就需要开始选择合适的算法模型,进行训练评估和测试了. 所以接下来会整理下比较常用的机器学习算法的汇总比较,包 ...

  8. 【黄啊码】百万级别订单量,如何生成唯一订单ID(雪花算法)

    Twitter-SnowFlake算法的产生是源于Twitter为了满足自己业务(每秒上万条消息的请求,每条消息都必须分配一条唯一的id,并且在分布式系统中不同机器产生的id必须不同)的需求. sno ...

  9. 6D姿态估计算法汇总(下)

    前言 接着上篇6D姿态估计算法汇总(上),原文请见6D姿态估计算法汇总(下) 10.PoseNet: A Convolutional Network for Real-Time 6-DOF Camer ...

最新文章

  1. linux 上传带宽限速
  2. IntelliJ IDEA 超实用技巧分享,不能再全了!
  3. leetcode198 打家劫舍
  4. 二进制部署Kubernetes v1.13.4 HA可选
  5. 要用linux,不会shell 基本语法搞不来~
  6. Requirejs常用配置和应用
  7. Python爬虫抓取网页
  8. 全国中小学信息技术创新与实践大赛:软件创意编程赛道
  9. sparksql处理mysql_Spark记录-SparkSQL远程操作MySQL和ORACLE
  10. 国外不错的模板素材网站
  11. 如果十二星座都有自己的专属 App,你会是哪一款?
  12. 买天猫网店转让成为电商创业新趋势
  13. python supervisor 检测代码变动重启_supervisor更改某项目配置后 需要重新启动才有效...
  14. 移植boa服务器和错误指南
  15. 解决浏览器能上网而其他软件无法联网的问题
  16. 小技巧助你解决div+css网页内容显示不完整
  17. 晋商消费金融总裁惠康获准,前不久被央行处罚49万元
  18. java特征向量计算_Java与Python计算特征向量的区别
  19. 常用的windows快捷键
  20. 创业公司股权分配的七大实操建议

热门文章

  1. 英语口语 week12 Thursday
  2. c++面向对象高级编程 学习十三 数量不定的模板参数,auto,for
  3. 麻雀虽小,五脏俱全:分析CVS活动情况的小工具(有源码供学习)
  4. Linux expr命令、Linux wc命令、Linux let 命令
  5. GFM与博客园markdown测试
  6. Servlet的入门
  7. Git的GUI工具sourcetree的使用
  8. windows下部署免费ssl证书(letsencrypt)
  9. BZOJ-1034 泡泡堂
  10. 骗子公司陆续公布中...