作者:張張張張
github地址:https://github.com/zhanghekai
【转载请注明出处,谢谢!】


★★★由于位运算直接对内存数据进行操作,不需要转成十进制,直接在二进制上进行运算,因此处理速度非常快!!!

一、按位“与”运算符

  • 按位“与”(Bitwise AND),运算符号为: & \& &
  • a & b a\&b a&b 的操作结果: a 、 b a、b ab中对应位同时为1,则对应结果位也为1,其余情况对应结果位为0。
    例:
    10010001101000101011001111000 &     111111100000000 − − − − − − − − − − − − − − − − 101011000000000 10010001101000101011001111000\\ \&\qquad\qquad\qquad\;\,111111100000000\\----------------\\\qquad\qquad\qquad\quad101011000000000 10010001101000101011001111000&111111100000000101011000000000

1. 用于整数的奇偶性判断

\qquad 一个整数 a a a a & 1 a\&1 a&1这个表达式可以用来判断 a a a的奇偶性。二进制的末尾位为 0 0 0表示偶数,末尾位为 1 1 1表示奇数。使用 a % 2 a\%2 a%2来判断奇偶性和 a & 1 a\&1 a&1是一样的作用,但是 a & 1 a\&1 a&1要快好多。

例:当 a a a为偶数时, a & 1 a\&1 a&1的结果为 0 0 0 a = 6 a=6 a=6
110 &     1 − − − − − − − − − − − − − − − −   0 110\\ \&\;\,1\\----------------\\\quad\,0 110&10

例:当 a a a为奇数时, a & 1 a\&1 a&1的结果为 1 1 1 a = 7 a=7 a=7
111 &     1 − − − − − − − − − − − − − − − −   1 111\\ \&\;\,1\\----------------\\\quad\,1 111&11

2. 判断a是否是2的正整数幂

\qquad 如果一个数 a a a他是 2 2 2的正整数幂,那么 a a a的二进制形式必定为 100000.... 100000.... 100000....(最高位为1,之后有0个或多个0,注意: 2 0 = 1 2^0 =1 20=1 1 1 1 2 2 2 0 0 0次幂);而 a − 1 a-1 a1的二进制形式必定是 111111... 111111... 111111...(全为 1 1 1,但当 a = 1 a=1 a=1时, a − 1 = 0 a-1=0 a1=0)。若 a a a 2 2 2的正整数幂,则必有 a & ( a − 1 ) a\&(a-1) a&(a1)结果为 0 0 0

例:当 a = 16 a=16 a=16时:
10000 &   1111 − − − − − − − − − − − − − − − −    0 10000\\ \&\,1111\\----------------\\\quad\quad\;0 10000&11110

3. 统计二进制数a中1的个数

朴素的统计方法是: 先判断 n n n的奇偶性,为奇数时计数器增加 1 1 1,然后将 a a a右移一位,重复上面的步骤,知道移位完毕。

公式法: a & ( a − 1 ) a\&(a-1) a&(a1) 的作用是消掉二进制数 a a a中最低位的 1 1 1。将 a & ( a − 1 ) a\&(a-1) a&(a1) 的结果重新赋值给 a a a,继续进行此操作,直到赋值结果为 0 0 0时终止,重复的次数即为 a a a 1 1 1的个数。

  • 以python代码为例: 7 7 7的二进制为 111 111 111
def a1(n):
    count = 0
    while n!=0:
        n = n&(n-1)
        count+=1
    return count

a1(7)

二、按位“异或”运算符

  • 按位“异或”,运算符号为: ⋀ \bigwedge
  • a ⋀ b a \bigwedge b ab 的操作结果: a 、 b a、b ab中对应位相异时(即:一个为0,一个为1),则对应结果位为1,其余情况对应结果位为0。
    例:
    1001 ⋀ 0101 − − − − − − − − − − − − − − − − 1100 \quad 1001\\ \bigwedge0101\\----------------\\\quad1100 100101011100
    知识点:
    1. 任何数和0异或为任何数:0 ^ n => n
    2. 相同的数异或为0:n ^ n => 0
    3. 满足交换律a ^ b ^ c <=> a ^ c ^ b

1. 不使用临时变量,交换a和b的值

\qquad 只需下列三行代码即可实现:

a = 7
b = 5

a = a^b
b = b^a
a = a^b

\qquad 最终输出结果为: a = 5 , b = 7 a= 5,b=7 a=5,b=7

2. 除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

注意: 相同的数异或为0:n ^ n => 0,且,满足交换律a ^ b ^ c <=> a ^ c ^ b

\qquad 只要让数组中的元素依次相“异或”,出现两次的元素最终异或为0,仅剩下唯一只出现过一次的元素。

python代码:

nums=[1,2,3,5,6,4,2,6,3,1,4]

def YiHuo(nums):
    result = 0
    for i in range(len(nums)):
        result = result ^ nums[i]   
    return result

print(YiHuo(nums))

\qquad 输出结果为: 5 5 5






【未完,随时更新】


【参考文献】
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐