算法与数据结构基础 - 位运算(Bit Manipulation)
位运算基础
说到与(&)、或(|)、非(~)、异或(^)、位移等位运算,就得说到位运算的各种奇淫巧技,下面分运算符说明。
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题:
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题:
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题:
4. 位移
a<<1效果相当于a*2(不超出数值类型范围情况下),a>>1效果相当于a/2,位移常用于按位轮询。
相关LeetCode题:
有意思的时当我们的目光放到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题:
421. Maximum XOR of Two Numbers in an Array 题解
使用bit表示数据
在一些场景下我们希望用bit来表示数据,或节省空间或利用bit的运算特性来表示状态转换。
相关LeetCode题:
算法与数据结构基础 - 位运算(Bit Manipulation)的更多相关文章
- 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)
堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...
- 算法与数据结构基础 - 广度优先搜索(BFS)
BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...
- 算法与数据结构基础 - 哈希表(Hash Table)
Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...
- 算法与数据结构基础 - 二叉树(Binary Tree)
二叉树基础 满足这样性质的树称为二叉树:空树或节点最多有两个子树,称为左子树.右子树, 左右子树节点同样最多有两个子树. 二叉树是递归定义的,因而常用递归/DFS的思想处理二叉树相关问题,例如Leet ...
- 算法与数据结构基础 - 分治法(Divide and Conquer)
分治法基础 分治法(Divide and Conquer)顾名思义,思想核心是将问题拆分为子问题,对子问题求解.最终合并结果,分治法用伪代码表示如下: function f(input x size ...
- 算法与数据结构基础 - 双指针(Two Pointers)
双指针基础 双指针(Two Pointers)是面对数组.链表结构的一种处理技巧.这里“指针”是泛指,不但包括通常意义上的指针,还包括索引.迭代器等可用于遍历的游标. 同方向指针 设定两个指针.从头往 ...
- 算法与数据结构基础 - 贪心(Greedy)
贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...
- 算法与数据结构基础 - 图(Graph)
图基础 图(Graph)应用广泛,程序中可用邻接表和邻接矩阵表示图.依据不同维度,图可以分为有向图/无向图.有权图/无权图.连通图/非连通图.循环图/非循环图,有向图中的顶点具有入度/出度的概念. 面 ...
- 算法与数据结构基础 - 深度优先搜索(DFS)
DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以 ...
随机推荐
- HDU 1398:Just a Hook(线段树区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=1698 Just a Hook Problem Description In the game of DotA ...
- Pandas Series 与 DataFrame 数据创建
>>> import pandas as pd >>> import numpy as np >>> print(np.__version__), ...
- Java项目案例之---计算公司员工的工资(面向对象复习)
计算公司员工的工资(面向对象复习) 某公司的雇员分为以下若干类: Employee:这是所有员工总的父类,属性:员工的姓名,员工的生日月份.方法:double getSalary(int month) ...
- 奇袭(单调栈+分治+桶排)(20190716 NOIP模拟测试4)
C. 奇袭 题目类型:传统 评测方式:文本比较 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目描述 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而 ...
- free()函数释放一段分配的内存之陷阱
朋友们对malloc函数应该是比较熟悉了,此函数功能是分配一段内存地址,并且将内存地址给一个指针变量,最后记得再调用free函数释放这段内存地址就可以了,标准的流程对吧,好像没什么问题.但是按照此标准 ...
- 小埋的Dancing Line之旅:比赛题解&热身题题解
答疑帖: 赞助团队:UMR IT Team和洛谷大佬栖息地 赛后题解:更新了那两道练手题的题解 赛时公告,不过一些通知也可能在团队宣言里发出 如果各位发现重题,请将你认为重复的题目链接连同这次比赛的题 ...
- openlayer 5 获取中心点
之前在控制台把map对象打印出来后,有一个很像中心点坐标map.focus_.我可以确定的告诉大家,这个不是中心点坐标,检查出来的结果是地图中心最右的点位. 在创建地图时,会将中心点左边写在view中 ...
- vue 的基本语法和常用指令
什么是vue.js Vue.js是目前最火的一个前端框架,React是最流行的一个前端框架(React除了开发网站,还可以开发手机App, Vue语法也是可以用于进行手机App开发的,需要借助于Wee ...
- WGS84坐标与web墨卡托投影坐标转换
许久没有使用坐标转换,记忆有些模糊了,以后还是会用到,先将WGS84与web墨卡托转换复习一下: 1.84转web墨卡托 //核心公式 平面坐标x = 经度*20037508.34/108 平面坐标y ...
- IOCP Input/Output Completion Port IO完成端口
I/O completion ports provide an efficient threading model for processing multiple asynchronous I/O r ...