关于位运算的Intuition和Methodology
作者:互联网
关于位运算的Intuition和Methodology(初级)
位运算
本文的目的旨在用启发式的形式理解位运算的一些常用方法论。
本人是第一次写文,若有不严谨的地方请多多包含。
基础
- &(与):
判断数字奇偶性:&的性质在于,1和1相遇的时候才会产生1。而二进制的第一位决定了一个这个二进制数的奇偶性。
例子:
十进制 | 二进制 |
---|---|
3 | 0011 |
6 | 0110 |
7 | 0111 |
将某个二进制数和1进行与操作,结果是1,该数为奇数,结果是0,该数为偶数。
-
|(或):
或的性质:只要有1在 ,那么结果就是1。这个性质可以让我们“合并”两个二进制数字。
例子:1010 | 0101 = 1111。用&取余:我们可以用 i & (2 ^ n - 1)来达到取余数的效果,其中i的范围是0—(2^n -1)
比如0–15 & 15 得到的总是左边他自己。(只在右边是2的正整数次幂减去1的情况下有效)
(与的作用更像取交集,或的作用更像取并集。)
- ^(异或):
经典应用:不用临时变量,交换两个数字:异或的性质在于,相同的两个位碰撞在一起会产出0,而0与任何数字异或会产出与0异或的那个数字。
也就是:0^b = b; b^b=0;
那么经典的交换算法也呼之欲出了:
a b
a^b b
a^b b ^ (a ^ b) = (a ^ b ^ b) = a ^ 0 = a
a^b a
a ^ a ^ b = b a
b a
我们其实还可以用异或做其他一些骚操作:
比如:有这么样一个数组,该数组中除了某个数字以外,其他所有数字都出现了两次。请找出这个只出现一次的这个数字。
[2,2,3,3,4,4,5,6,6,7,7]
又比如:一个长为n的数组,里面的数字范围是0--n-1,但是仅有一个数字重复出现了两次。请找出这重复出现的数字。
[0,1,2,2,4,5,6,7]
这些题目都可以用异或来解。
最重要的是把异或当成一个可以让两个相同数字消灭的作用来看待。
标签:Intuition,数字,二进制,异或,奇偶性,Methodology,数组,运算 来源: https://blog.csdn.net/qq_35270919/article/details/115216236