【OI】位运算操作
一、基础操作
1.a<<b
将二进制a左移b位,不够的地方用0补位
例如
100<<2 == 10000
2.a>>b
将二进制a右移b位
例如
100>>2 == 1
3.a|b
或操作(按位或),相同位中只要有一个1或者两个1则结果为1,全0则结果为0
4.a&b
与操作(按位与),相同位中只要都是1,则结果为1,如果一个为0一个为1或者都是0则结果为0。
5.a^b
异或,相同位只要一个1一个0,则结果为1;相同位二进制相同则结果为0 。
二、进阶操作
1.快速求2^n
1<<n == pow(2,n)
原理:1<<n的意思是1的二进制向左移动n位,则此数二进制形式变成了 100000...000(n个0),恰好是2^n
2.判断奇数偶数
n&1 == 1则为奇数
n&1 == 0则为偶数
原理:n&1的意思是n与1,那么n与1中,1除了右端位为1其他位都是0,则由与运算得到的结果中其他位必定都是0 。
所以最后得到的结果只与1的右端位和n的右端位有关,我们知道1的右端位为1,那么n的右端位只有为1的时候与1进行与运算的结果是1;n的右端位只有为0的时候与1进行与运算的结果是0 。
显然二进制右端位为1的时候该数为奇数,为0时该数为偶数,所以得证。
3.lowbit
a&(-a) 代表着a的二进制的最后一位。
原理:涉及到二进制的补码知识,感兴趣的人可以自己了解。
三、高阶操作
1.a >> b & 1 代表着如果a的第b位为1则为真
用来判断二进制的某一位
原理:a左移b位,则a的右端位就是原来a的第b位,这时与1做与运算(1左边的0由与运算性质得没有影响)就可以得知这一位是1还是0(1&1 == 1,0|1 == 0 )
2.a|(1<<n) 代表着将a的二进制的第n位设为1
原理:1<<n可以看作由一个1和n个0组成的二进制数,其中0的部分由或的性质(0|0==0,1|0==1)可以知道不会对二进制位产生影响。
而1的部分由或的性质(1|1==1,0|1=1)可以得出一定是1。
四、图论
x表示要判断的点,S表示集合
(1 << x) & S == true 即x在S集合里,如果为false则x不在S集合里
S = S | (1 << x) 表示S集合中加入了x点
【OI】位运算操作的更多相关文章
- c#枚举位运算操作
抛出预设问题 需要有一个npc需要在一周中的,周一,周二,周三会出现,其他时间不可见 解决问题 因为一周时间是固定的,所以创建枚举类型比较合适,如下 enum Days { None, Sunday, ...
- Matlab位运算操作
本文为转载他人文章: bitand 按位与操作 a = 7; b = bitand(10,a); disp(dec2bin(a,8)); %ans = 00000111 disp(dec2bin(b, ...
- 2.2 Go语言基础之位运算操作
一.位运算符 位运算符对整数在内存中的二进制位进行操作. 运算符 描述 & 参与运算的两数各对应的二进位相与. (两位均为1才为1) | 参与运算的两数各对应的二进位相或. (两位有一个为1就 ...
- AcWing 两个简单的位运算操作
//是柱状数组的一个基操作 //返回n的最后一位1:lowbit(n) = n & -n //比如 x=1010 那么返回10 x=101000 返回1000 #include<bits ...
- javascript 位运算
位运算博大精深,本文总结下基本的位运算的概念. 1.整数的二进制码 位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值.ECMAScript中的所有数值都以IEEE-754 64位格式存储 ...
- javascript的变态位运算
javascript的变态位运算 var a = "10" | 0; alert(a); alert (typeof a);结果为10,number. 这就是说这条语句可以将字符串 ...
- UVA 10718 Bit Mask 贪心+位运算
题意:给出一个数N,下限L上限U,在[L,U]里面找一个整数,使得N|M最大,且让M最小. 很明显用贪心,用位运算搞了半天,样例过了后还是WA,没考虑清楚... 然后网上翻到了一个人家位运算一句话解决 ...
- 利用位运算进行a+b的计算(Java&&Python)
题目链接 需要用到的位运算操作:异或(^).与(&).右移(<<) 异或运算:又称不进位加法,a^b得到的结果为a与b相加,但是需要进位的地方不进位得到的结果 与运算:找出来a和b ...
- P3613 睡觉困难综合征(LCT + 位运算)
题意 NOI2014 起床困难综合症 放在树上,加上单点修改与链上查询. 题解 类似于原题,我们只需要求出 \(0\) 和 \(2^{k - 1} - 1\) 走过这条链会变成什么值,就能确定每一位为 ...
随机推荐
- Spring AOP(二)--注解方式
本文介绍通过注解@AspectJ实现Spring AOP,这里要重点说明一下这种方式实现时所需的包,因为Aspect是第三方提供的,不包含在spring中,所以不能只导入spring-aop的包,为了 ...
- hibernate 一对一注解
bi如 用户的阅读历史和文章表是单向一对一关系, 阅读历史中通过deviceId外键关联文章表的主键 然后,再从getter setter上进行注解 @OneToOne(cascade = Casca ...
- python中的*args与**kwargs的含义与作用
在定义函数的时候参数通常会使用 *args与**kwgs,形参与实参的区别不再赘述,我们来解释一下这两个的作用. *args是非关键字参数,用于元组,**kwargs是关键字参数 (字典)例如下面的代 ...
- NGINX模块开发 之 验证URL參数
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/RoyalApex/article/details/26404379 作者:邹祁峰 邮箱:Qifeng ...
- HBase底下的存储机制
Split机制:可以理解为HDFS上Block一分二的情况.每个Table一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,Hregion就会等分会两个新的 ...
- 洛谷P5319 奥术神杖
题意:给你若干个串和一个填了一部分的串.补完这个串使得 (每个串的匹配次数 * 权值) ^ (1 / 所有串匹配次数) 最大. 解:把这个东西随便取一个对数,就变成了分数规划. 二分.然后在AC自动机 ...
- scrollbar 滚动条
滚动条样式:自定义元素的滚动条 <!DOCTYPE html> <html> <head lang="en"> <meta charset ...
- 如何在linux中部署mongodb并设置连接认证
在windows上给mongodb设置连接认证权限:mongodb默认是不认证的,默认没有账号,现在就讲讲怎么设置账户和密码 1.首先进入C:\mongodb\bin下面双击运行mongo.exe启动 ...
- meet-in-the-middle 基础算法(优化dfs)
$meet-in-the-middle$(又称折半搜索.双向搜索)对于$n<=40$的搜索类型题目,一般都可以采用该算法进行优化,很稳很暴力. $meet-in-the-middle$算法的主要 ...
- Java问题解读系列之String相关---String类为什么是final的?
今天看到一篇名为<Java开发岗位面试题归类汇总>的博客,戳进去看了一下题目,觉得有必要夯实一下基本功了,所以打算边学边以博客的形式归纳总结,每天一道题, 并将该计划称为java问题解读系 ...