12月组队学习 Task 05

Task 05 位运算

1. 位运算简介

  • 位运算(Bit Operation):在计算机内部,数是以「二进制(Binary)」的形式来进行存储。位运算就是直接对数的二进制进行计算操作,在程序中使用位运算进行操作,会大大提高程序的性能。

二进制数(Binary):由0和1两个数码来表示的数。二进制数中每一个0或每一个1都称为一个「位(Bit)」。

2. 位运算基础操作

在二进制的基础上,可以对二进制数进行相应的位运算。基本的位运算共有6种,分别是:「按位与运算」、「按位或运算」、「按位异或运算」、「取反运算」、「左移运算」、「右移运算」。

这里的「按位与运算」、「按位或运算」、「按位异或运算」、「左移运算」、「右移运算」是双目运算。

「按位与运算」、「按位或运算」、「按位异或运算」是将两个整数作为二进制数,对二进制数表示中的每一位(即二进位)逐一进行相应运算,即双目运算。
「左移运算」、「右移运算」是将左侧整数作为二进制数,将右侧整数作为移动位数,然后对左侧二进制数的全部位进行移位运算,每次移动一位,总共移动右侧整数次位,也是双目运算。

而「取反运算」是单目运算,是对一个整数的二进制数进行的位运算。

  • 按位与运算(AND):按位与运算符为 &。只要对应的两个二进位有一个为1时,结果位就为1。

  • 按位或运算(OR):按位或运算符为 |。只有对应的两个二进位都为1时,结果位才为1。

  • 左移运算(SHL): 左移运算符为 <<。将二进制数的各个二进位全部左移若干位。<< 右侧数字指定了移动位数,高位丢弃,低位补0。

  • 右移运算(SHR): 右移运算符为 >>。对二进制数的各个二进位全部右移若干位。>> 右侧数字指定了移动位数,低位丢弃,高位补0。

  • 按位异或运算(XOR):按位异或运算符为 ^。对应的两个二进位相异时,结果位为1,二进位相同时则结果位为0。

  • 取反运算(NOT):取反运算符为 ~。对二进制数的每个二进位取反,使数字1变为0,0变为1。

3. 位运算的应用

3.1 位运算的常用操作

3.1.1 判断整数奇偶

一个整数,只要是偶数,其对应二进制数的末尾一定为0;只要是奇数,其对应二进制数的末尾一定为 1。所以,我们通过与1进行按位与运算,即可判断某个数是奇数还是偶数。

(x & 1) == 0 为偶数。

(x & 1) == 1 为奇数。

3.1.2 二进制数选取指定位

如果想要从一个二进制数X中取出某几位,使取出位置上的二进位保留原值,其余位置为0,则可以使用另一个二进制数Y,使该二进制数上对应取出位置为1,其余位置为0。然后令两个数进行按位与运算(X & Y),即可得到想要的数。

3.1.3 将指定位设置为 1

如果想要把一个二进制数X中的某几位设置为1,其余位置保留原值,则可以使用另一个二进制数 Y,使得该二进制上对应选取位置为1,其余位置为0。然后令两个数进行按位或运算(X | Y),即可得到想要的数。

3.1.4 反转指定位

如果想要把一个二进制数X的某几位进行反转,则可以使用另一个二进制数Y,使得该二进制上对应选取位置为1,其余位置为0。然后令两个数进行按位异或运算(X ^ Y),即可得到想要的数。

3.1.5 交换两个数

通过按位异或运算可以实现交换两个数的目的(只能用于交换两个整数)。

a, b = 10, 20
a ^= b
b ^= a
a ^= b
print(a, b)

20 10
3.1.6 将二进制最右侧为1的二进位改为0

通过 X & (X - 1) 的操作即可完成。

3.1.7 计算二进制中二进位为1的个数

不断通过 X & (X - 1) 操作,最终将二进制X变为0,并统计执行次数,则可以得到二进制中二进位为
1的个数。

class Solution:
    def hammingWeight(self, n: int) -> int:
        cnt = 0
        while n:
            n = n & (n - 1)
            cnt += 1
        return cnt

3.1.8 判断某数是否为2的幂次方

通过判断 X & (X - 1) == 0 是否成立,即可判断X是否为2的幂次方。

凡是2的幂次方,其二进制数的某一高位为1,并且仅此高位为1,其余位都为0。不是2的幂次方,其二进制数存在多个值为1的位。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值