首页 二进制的与运算
文章
取消

二进制的与运算

与运算是两个值的运算,只有两者都为1,结果才为1,否则结果为0。

aba&b
111
100
000
010

应用实例

掩码

掩码的典型例子就是子网掩码,其利用了与运算来计算 IPv4 地址的网络地址。

172.16.10.33/27 中的172.16.10.33 为 IPv4 地址,27为子网掩码中1的长度,剩余5位为0。其网络地址计算方法为:

1
2
3
10101100 00010000 00001010 00100001 # 172.16.10.33 转换为二进制
11111111 11111111 11111111 11100000 # 子网掩码转换为二进制
10101100 00010000 00001010 00100000 # 与计算结果,转换为可读的十进制即为 172.16.10.32

从而得知网络地址为 172.16.10.32

判断整数奇偶

对于任何一个奇数 a,有 a&1=1。

对于任何一个偶数 a,有 a&1=0。

如:

1
2
3
4
5
# 7&1
111 & 001= 1

# 6&1
110 & 001 =0

验证整数是否是2的n次方

对于任意一个2的整数次幂 a ,有 a&(a-1)=0

如:

1
2
3
4
5
# 14!=0,15不是2的整数次幂
15&(15-1)=14

# 0=0,16是2的整数次幂
16&(16-1)=0

计算整数的二进制中1的个数

1
2
3
4
5
6
7
8
9
10
11
12
13
def get_1_count(num):
    count = 0
    while num:
        count += 1
        num &= num - 1
    return count


if __name__ == '__main__':
    n = 135
    print(n)                    # 135
    print("{0:b}".format(n))    # 10000111
    print(get_1_count(n))       # 4

取int型值的指定位的值

一个比特位和1与运算,结果为比特位的值。

那么,取一个int值 a 的第k位(从左往右,k从1开始)可以用 a>>k&1

如:

1
2
3
4
5
6
7
# 取数值17的第3位
00010001>>3 =00010
00010&00001 =00000 # 0 即为结果

# 取数值17的第4位
00010001>>4 =0001
0001&0001   =0001

将int型值的指定位置清0

方法就是先找到第k位,再和0进行与运算即可,a&~(1<<k)

如将17的二进制第4位置为0,17&~(1<<4)=1

去除二进制表示中的最后一个1

对于整数 n,去除二进制表示中的最后一个1 可使用 n&(n-1)

过程示意如下: img

本文由作者按照 CC BY 4.0 进行授权