首先
位运算这个东西在考试中十分容易考,所以要多多看一看位运算的相关知识,多刷一刷题之类的。
位运算的概念
位运算就是二进制数据进行运算的运算符。
注意:通常我们用二进制补码来表示,补码的符号位也是要参与运算的。
通常的位运算分为:与、或、非、异或、左移、右移等。
非:not 符号:¬ 与:and 符号:∧ 或:or 符号:∨ 异或:xor 符号:⊕
左移:<< 右移:>>
非:按位取反,用符号 “ ¬ ” 表示,c++用 “ ~ ” 。。如:¬ 101 = 010 。
与:同一位都为 1 时结果才为 1(真),否则为 0 (假)。用符号“∧”表示,c++用 “ & ” 。如:101 ∧ 110 = 100 。
或:两个二进制补码的同一位都为 0 时结果才为 0 (真),否则为 1 (假)。用符号“∨”表示,c++用 “ | ” 。如:101 | 100 = 010 。
异或: 如果两个二进制补码不相同,则异或结果为 1 (真),如果两个二进制补码相同,异或结果为 0 (假)。用符号 “ ⊕ ” 表示,c++用 “ ^ ” 。如:1010 ⊕ 1111 = 0101 。常见用法:反转二进制,只需要将想要反转的位异或 1 就可以了。
左移:将原本的二进制补码进行往左偏移运动,空位补 0 。
如:
原数:1010 。
1010 << 1 变成: 1010_(“_”是缺位的意思)最后变成: 10100 。
现数:10100(多了一个 0 )。
右移:将原本的二进制补码进行往右偏移运动。空位补 0 ,超位的删除。
如:
原数:1011 。
1011 >> 1 变成: _101 ' 1 '(“_”是缺位的意思,引号引出来的是超位)最后变成: 0101 。
现数:0101(最后一个 1 被删除了,前面补了一个 0 )。
优先级
注意:同级的运算符不分高低,计算时按照从左到右运算。
位运算的运用
若二进制补码为 S ,那么对 S 有以下操作(反向从第 0 位开始):
① 判断第 i 位是否为 0:
S &( 1 << i )== 0,将 1 左移 i 位与 S 进行与运算后,看结果是否为 0 。
( S >> i )& 0x0000001 看结果是否为 0 。
② 将第 i 位设置为 1:
S |( 1 << i ),将 1 左移 i 位与S进行运算。
③ 将第 i 位设置为 0:
S & ~( 1 << i ),S与第 i 位为 0,其余位为 1 的数进行与运算。
如:S = 1010101,i = 5 实际上是第 6 位。
S &( 1 << i ):1010101 & 0100000 = 000000
④ 清零:n = 0 或 n & =0
⑤ 判断奇偶:a % 2 == 0 或 (a & 1)== 0
⑥ 取一个数的指定位:如:x = 1010 1110,y = 0000 1111,只需(x & y),结果:0000 1110
⑦ 判断 x 是不是 2的幂次:x & x - 1
⑧得到最后的 1 及后面的 0(2 的幂次) x & -x
位运算效率比较高,如果遇到有幂次或者 2 的倍数等题目,尽量使用位运算,不会的千万别使用 !
:1 << n
n/2:n >> 1
n*2:n << 1
最后(不想看的可以不看)
这个博主真有趣,给他点赞,关注加收藏吧!
制作不易,点个赞吧!!!
制作不易,点个赞吧!!!
制作不易,点个赞吧!!!