【Python】——位运算(详解)

hello,各位旅行者们,今天我们要开位运算书。信我,比森林书好肝多了(*/ω\*)

一.什么是位运算符,为什么要学习它

在计算机科学中,二进制数是最基本的数据类型之一,位运算符是一类用于操作二进制数位的运算符(就像是+ - * /),它们直接对二进制数的位进行操作。

使用位运算符有几个好处:

  1. 效率高: 位运算是在底层直接对二进制数进行操作,因此通常比使用算术运算符更快速和高效。这对于一些性能要求较高的场景,比如网络编程、密码学等领域尤为重要。

  2. 节省空间: 由于位运算直接操作的是二进制位,所以在存储空间上比起使用普通的算术运算符更加节省。这在需要大量数据存储或者传输的情况下尤为重要,比如在编码压缩、图形处理等领域。

  3. 逻辑清晰: 对于一些需要进行位操作的任务,使用位运算符可以使代码更加简洁和清晰,因为它们直接表达了对二进制数的操作,避免了繁琐的位操作手动实现。

  4. 加密和解密: 在密码学中,位运算符经常用于加密和解密算法中,因为它们可以直接对二进制数据进行处理,提供了强大的加密保护和安全性

二.位运算符都有哪些,功能分别是什么

  1. 与运算符(&)对应位都为1时结果为1,否则为0。常用于提取指定位的信息、清零特定位等操作。

    • 示例:假设我们有两个二进制数 1010 和 1100,我们可以使用与运算符来提取它们的共同位。
    • 运算: 1010 & 1100 = 1000
    • 解释:在这个例子中,只有在两个二进制数相应的位都为1时,结果的对应位才为1。因此,1010 & 1100 的结果为 1000
    • 分配律: a & (b | c) = (a & b) | (a & c)
    • 结合律: (a & b) & c = a & (b & c)
    • 恒等律: a & 1111...1111 = a
    • 零律: a & 0000...0000 = 0
  2. 或运算符(|)只要对应位中有一个为1时结果为1。常用于设置特定位为1、将多个条件合并等。

    • 示例:假设我们有两个二进制数 1010 和 1100,我们可以使用或运算符来将它们的对应位中的任何一个为1的位设置为1。
    • 运算: 1010 | 1100 = 1110
    • 解释:在这个例子中,只要两个二进制数相应的位中有一个为1,结果的对应位就为1。因此,1010 | 1100 的结果为 1110
    • 分配律: a | (b & c) = (a | b) & (a | c)
    • 结合律: (a | b) | c = a | (b | c)
    • 恒等律: a | 0000...0000 = a
    • 零律: a | 1111...1111 = 1
  3. 异或运算符(^)对应位不同时结果为1。常用于二进制数据的加密、检查两个数是否相同等。

    • 示例:假设我们有两个二进制数 1010 和 1100,我们可以使用异或运算符来检查它们的对应位是否相同。
    • 运算: 1010 ^ 1100 = 0110
    • 解释:在这个例子中,如果两个二进制数的对应位相同,则结果的对应位为0,否则为1。因此,1010 ^ 1100 的结果为 0110
    • 分配律: a ^ (b & c) = (a ^ b) & (a ^ c)
    • 结合律: (a ^ b) ^ c = a ^ (b ^ c)
    • 恒等律: a ^ 0000...0000 = a
    • 自反律: a ^ a = 0
  4. 取反运算符(~)将一个数的二进制数按位进行取反操作,即将所有的0变为1,将所有的1变为0。

    • 示例:假设我们有一个二进制数 1010,我们可以使用取反运算符来对其进行取反操作。
    • 运算: ~1010 = 0101
    • 解释:在这个例子中,每个位的值被取反,即0变为1,1变为0。因此,~1010 的结果为 0101
    • 取反律: ~a = -a - 1
  5. 左移运算符(<<)将数字的位向左移动指定的位数,高位丢弃,低位补0。相当于乘以2的n次方。常用于在二进制数中进行乘法运算。

    • 示例:假设我们有一个二进制数 1010,我们可以使用左移运算符来将其向左移动两位。
    • 运算: 1010 << 2 = 101000
    • 解释:在这个例子中,二进制数向左移动两位,高位丢弃,低位补0。因此,1010 << 2 的结果为 101000
    • 结合律: (a << b) << c = a << (b + c)
    • 恒等律: a << 0 = a
  6. 右移运算符(>>)将数字的位向右移动指定的位数,低位丢弃,高位补0或者保持符号位不变。相当于除以2的n次方。常用于在二进制数中进行除法运算。

    • 示例:假设我们有一个二进制数 1010,我们可以使用右移运算符来将其向右移动一位。
    • 运算: 1010 >> 1 = 0101
    • 解释:在这个例子中,二进制数向右移动一位,低位丢弃,高位补0。因此,1010 >> 1 的结果为 0101
    • 结合律: (a >> b) >> c = a >> (b + c)
    • 恒等律: a >> 0 = a

到了这里,脑子是不是快要,别灰心,也不是全都要用上的😊

三.位运算符常用场景

在算法竞赛中常用的位运算知识点:

  1. 位操作技巧

    • 快速判断奇偶性:if (x & 1) { /* x是奇数 */ }
    • 快速除以2:x >>= 1(相当于x //= 2
    • 快速乘以2:x <<= 1(相当于x *= 2
    • 判断第n位是否为1:if (x & (1 << n)) { /* 第n位是1 */ }
    • 设置第n位为1:x |= (1 << n)
    • 将第n位清零:x &= ~(1 << n)
    • 切换第n位的状态:x ^= (1 << n)
  2. 位运算与位掩码

    • 使用位运算符创建和操作位掩码,用于标记状态、标志位、选项等。
    • 位掩码的常见操作包括设置、清除、切换某一位的状态等。
  3. 位运算与计数

    • 使用位运算统计二进制表示中1的个数(也称为"汉明权重"或"popcount")。
    • 可以利用技巧实现高效的计数算法,例如Brian Kernighan算法或分治法
  4. 位运算与排列组合

    • 使用位运算生成子集、排列、组合等。
    • 位运算可以方便地枚举所有可能的组合情况,例如使用位掩码进行组合的生成。
  5. 位运算与状态压缩

    • 在动态规划等问题中,使用状态压缩技巧将状态表示为一个整数,从而减少内存占用和加速计算过程。

在实战项目中常用的位运算知识点:

  1. 存储空间优化

    使用位运算技巧来优化存储空间,尤其在大规模数据处理、数据库设计等项目中,节省每一位的存储空间都能带来巨大的收益。
  2. 网络协议与数据传输

    在网络协议的设计和数据传输过程中,位运算常用于数据的编解码、校验和加密解密等操作。
  3. 硬件相关操作

    在嵌入式系统开发、驱动程序编写等项目中,位运算常用于与硬件的交互和控制,例如设置寄存器、处理传感器数据等。
  4. 加密与安全

    在信息安全领域,位运算常用于加密算法、哈希函数、身份验证等方面,保护数据的安全性和完整性。
  5. 图形图像处理

    在图形图像处理项目中,位运算常用于图像的压缩、颜色处理、像素操作等,提高图像处理效率和性能。
  6. 数据库设计

    在数据库设计中,位运算可以用于存储和操作大量的标志位、权限信息等,优化数据库结构和查询性能。

补充:

1. 二进制和十六进制的关系

  • 二进制是计算机的基础,所有数据在计算机中都是以二进制形式存储和处理的。

  • 十六进制是二进制的简写形式,每 4 位二进制数可以表示为 1 位十六进制数。

    • 例如:

      • 二进制 1010 = 十六进制 a

      • 二进制 1111 = 十六进制 f

  • 这种关系使得十六进制非常适合表示和操作二进制数据。


2. 特殊模式的来源

这些特殊模式的设计是为了满足特定的位操作需求。以下是它们的来源和设计逻辑:

(1)交替模式
  • 0xaaaaaaaa

    • 二进制:10101010 10101010 10101010 10101010

    • 设计逻辑:所有奇数位为 1,偶数位为 0

    • 用途:用于提取或检查奇数位。

  • 0x55555555

    • 二进制:01010101 01010101 01010101 01010101

    • 设计逻辑:所有偶数位为 1,奇数位为 0

    • 用途:用于提取或检查偶数位。

(2)分组模式
  • 0xcccccccc

    • 二进制:11001100 11001100 11001100 11001100

    • 设计逻辑:每两位重复 11 和 00

    • 用途:用于处理两位一组的操作。

  • 0x33333333

    • 二进制:00110011 00110011 00110011 00110011

    • 设计逻辑:每两位重复 00 和 11

    • 用途:用于处理两位一组的操作。

(3)块模式
  • 0xf0f0f0f0

    • 二进制:11110000 11110000 11110000 11110000

    • 设计逻辑:每四位重复 1111 和 0000

    • 用途:用于处理四位一组的操作。

  • 0x0f0f0f0f

    • 二进制:00001111 00001111 00001111 00001111

    • 设计逻辑:每四位重复 0000 和 1111

    • 用途:用于处理四位一组的操作。

(4)边界模式
  • 0x80000000

    • 二进制:10000000 00000000 00000000 00000000

    • 设计逻辑:最高位为 1,其余位为 0

    • 用途:用于检查符号位(如 32 位整数的符号位)。

  • 0x7fffffff

    • 二进制:01111111 11111111 11111111 11111111

    • 设计逻辑:最高位为 0,其余位为 1

    • 用途:用于表示最大正数(如 32 位整数的最大值)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值