一、基础操作

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】位运算操作的更多相关文章

  1. c#枚举位运算操作

    抛出预设问题 需要有一个npc需要在一周中的,周一,周二,周三会出现,其他时间不可见 解决问题 因为一周时间是固定的,所以创建枚举类型比较合适,如下 enum Days { None, Sunday, ...

  2. Matlab位运算操作

    本文为转载他人文章: bitand 按位与操作 a = 7; b = bitand(10,a); disp(dec2bin(a,8)); %ans = 00000111 disp(dec2bin(b, ...

  3. 2.2 Go语言基础之位运算操作

    一.位运算符 位运算符对整数在内存中的二进制位进行操作. 运算符 描述 & 参与运算的两数各对应的二进位相与. (两位均为1才为1) | 参与运算的两数各对应的二进位相或. (两位有一个为1就 ...

  4. AcWing 两个简单的位运算操作

    //是柱状数组的一个基操作 //返回n的最后一位1:lowbit(n) = n & -n //比如 x=1010 那么返回10 x=101000 返回1000 #include<bits ...

  5. javascript 位运算

    位运算博大精深,本文总结下基本的位运算的概念. 1.整数的二进制码 位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值.ECMAScript中的所有数值都以IEEE-754 64位格式存储 ...

  6. javascript的变态位运算

    javascript的变态位运算 var a = "10" | 0; alert(a); alert (typeof a);结果为10,number. 这就是说这条语句可以将字符串 ...

  7. UVA 10718 Bit Mask 贪心+位运算

    题意:给出一个数N,下限L上限U,在[L,U]里面找一个整数,使得N|M最大,且让M最小. 很明显用贪心,用位运算搞了半天,样例过了后还是WA,没考虑清楚... 然后网上翻到了一个人家位运算一句话解决 ...

  8. 利用位运算进行a+b的计算(Java&&Python)

    题目链接 需要用到的位运算操作:异或(^).与(&).右移(<<) 异或运算:又称不进位加法,a^b得到的结果为a与b相加,但是需要进位的地方不进位得到的结果 与运算:找出来a和b ...

  9. P3613 睡觉困难综合征(LCT + 位运算)

    题意 NOI2014 起床困难综合症 放在树上,加上单点修改与链上查询. 题解 类似于原题,我们只需要求出 \(0\) 和 \(2^{k - 1} - 1\) 走过这条链会变成什么值,就能确定每一位为 ...

随机推荐

  1. webstorm激活破解方法

    注册时,在打开的License Activation窗口中选择“License server”,在输入框输入下面的网址: http://idea.imsxm.com/ 点击:Activate即可. 如 ...

  2. C++ Primer 阅读小结

    一.变量和基本类型 类型是C++程序设计的基础. 每种类型都定义了其存储空间要求和可以在该类型的所有对象上执行的操作.C++提供了一组基本内置类型,如int.char等.这些类型与它们在机器硬件上的标 ...

  3. js中的自执行匿名函数 (function(){})()

    JS函数有两种命名方式 1.声明式 声明式会导致函数提升,function会被解释器优先编译.即我们用声明式写函数,可以在任何区域声明,不会影响我们调用. function XXX(){} 2.函数表 ...

  4. win10上的vs2015项目到win7的2015无法使用

  5. BZOJ2982: combination Lucas模板

    2982: combination Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 734  Solved: 437[Submit][Status][Di ...

  6. Luogu P2831 愤怒的小鸟(状压+记忆化搜索)

    P2831 愤怒的小鸟 题意 题目描述 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于\((0,0)\)处,每次Kiana可以用它向第一象限发射 ...

  7. spotbus gradle-qulity-plugiin 多项目bug检查

    https://spotbugs.readthedocs.io/en/latest/bugDescriptions.html https://xvik.github.io/gradle-quality ...

  8. 修改代码150万行!与 Blink 合并后的 Apache Flink 1.9.0 究竟有哪些重大变更?

    8月22日,Apache Flink 1.9.0 正式发布,早在今年1月,阿里便宣布将内部过去几年打磨的大数据处理引擎Blink进行开源并向 Apache Flink 贡献代码.当前 Flink 1. ...

  9. bzoj 4373 算术天才⑨与等差数列——线段树+set

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4373 能形成公差为k的等差数列的条件:mx-mn=k*(r-l) && 差分 ...

  10. web服务器--nginx简介

    nginx 介绍Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务.Nginx是一款轻量级的Web 服务器/反向代理服务器及电 ...