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