位运算基础

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

1. 与(&)

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

    //191. Number of 1 Bits
int hammingWeight(uint32_t n) {
int res=;
while(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;
return !(num&(num-)) && (num&0x55555555);
}

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

0xaaaaaaaa :  (偶数位为1,奇数位为0)
0x33333333 : 00 (1和0每隔两位交替出现)
0xcccccccc : (0和1每隔两位交替出现)
0x0f0f0f0f : (1和0每隔四位交替出现)
0xf0f0f0f0 : (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>>);
return (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) {
int res=;
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) {
int mask=,size=nums.size(),ret=;
for(int i=;i<32;i++){
int count=;
for(int j=;j<size;j++){
if(nums[j]&mask) count++;
if(count>size/){
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  题解

LeetCode编程训练 - 位运算(Bit Manipulation)的更多相关文章

  1. 【LeetCode】位运算 bit manipulation(共32题)

    [78]Subsets 给了一个 distinct 的数组,返回它所有的子集. Example: Input: nums = [,,] Output: [ [], [], [], [,,], [,], ...

  2. LeetCode解题中位运算的运用

    位运算是我最近才开始重视的东西,因为在LeetCode上面刷题的时候发现很多题目使用位运算会快很多.位运算的使用包含着许多技巧(详细可以参考http://blog.csdn.net/zmazon/ar ...

  3. 算法与数据结构基础 - 位运算(Bit Manipulation)

    位运算基础 说到与(&).或(|).非(~).异或(^).位移等位运算,就得说到位运算的各种奇淫巧技,下面分运算符说明. 1. 与(&) 计算式 a&b,a.b各位中同为 1 ...

  4. C#LeetCode刷题-位运算

    位运算篇 # 题名 刷题 通过率 难度 78 子集   67.2% 中等 136 只出现一次的数字 C#LeetCode刷题之#136-只出现一次的数字(Single Number) 53.5% 简单 ...

  5. [LeetCode]78. 子集(位运算;回溯法待做)

    题目 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3],   [1],   ...

  6. 位运算(Bit Manipulation)在算法中的应用

    最近刷LettCode,遇到几个没思路的算法题,都是关于位运算的 # 136 Single Number Given a non-empty array of integers, every elem ...

  7. leetcode 几何题 位运算 面试编程

    [BZOJ][CQOI2014]数三角形 Description给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. Input ...

  8. Leetcode 编程训练

    Leetcode这个网站上的题都是一些经典的公司用来面试应聘者的面试题,很多人通过刷这些题来应聘一些喜欢面试算法的公司,比如:Google.微软.Facebook.Amazon之类的这些公司,基本上是 ...

  9. Leetcode 编程训练(转载)

    Leetcode这个网站上的题都是一些经典的公司用来面试应聘者的面试题,很多人通过刷这些题来应聘一些喜欢面试算法的公司,比如:Google.微软.Facebook.Amazon之类的这些公司,基本上是 ...

随机推荐

  1. .Net 入门资料推荐 (编辑中)

    1.首先推荐 网易云课堂上的一个付费课程:常老师带你学ASP.NET MVC ,价格199元 2. 一个.net的框架,ABP,中文介绍如下 http://www.cnblogs.com/farb/p ...

  2. 《利用Python进行数据分析·第2版》

    <利用Python进行数据分析·第2版> 第 1 章 准备工作第 2 章 Python 语法基础,IPython 和 Jupyter第 3 章 Python 的数据结构.函数和文件第 4 ...

  3. cadcam

    Email:kefu007@vip.qq.com 13D TIMON 2007 英語版2007 23DVIA Composer V6R2013 中文版2013 3ABQUS V6.11 6.11 4A ...

  4. struts2-剩余

    一.说明 类型转换.输入验证(前台和后台)(validate().validateXXX().xml) 标签.上传下载.i18n(国际化).ognl(#reqeust.name) 注解方式.log4j ...

  5. web.xml 简记

    web.xml (tomcat启动时读取的配置文件) 首页配置 <welcome-file-list>:index.jsp servlet配置(<servlet>和<se ...

  6. java实现定时任务的三种实现方法

    转载于:https://blog.csdn.net/haorengoodman/article/details/23281343/ /** * 普通thread * 这是最常见的,创建一个thread ...

  7. Python3学习笔记十五

    ---恢复内容开始--- 1.  jquery的属性操作  $().attr(属性名)    取值 $().attr(属性名,属性值)      赋值 <!DOCTYPE html> &l ...

  8. Docker 的点点滴滴

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Li ...

  9. ASP.NET Core MVC 授权的扩展:自定义 Authorize Attribute 和 IApplicationModelProvide

    一.概述 ASP.NET Core MVC 提供了基于角色( Role ).声明( Chaim ) 和策略 ( Policy ) 等的授权方式.在实际应用中,可能采用部门( Department , ...

  10. pwn学习之二

    刚刚开始学习pwn,记录一下自己学习的过程. 今天get了第二道pwn题目的解答,做的题目是2017年TSCTF的easy fsb,通过这道题了解了一种漏洞和使用该漏洞获取shell的方法:即格式化字 ...