优秀程序员必须知道的20个位运算技巧

优秀程序员必须知道的20个位运算技巧攻略

什么是位运算?

位运算是一种对二进制数进行运算的方法,包括按位与(&),按位或(|),按位异或(^),以及取反(~)等操作。在计算机领域,位运算被广泛使用,能够有效提高程序的效率和可靠性。

为什么需要位运算?

在很多情况下,位运算比其它运算符更高效。例如,在计算机领域,位运算操作单元的大小通常为字节(8位),因此对其进行操作比较方便。此外,在一些程序中,位运算可以更方便地实现某些特定功能,例如判断奇偶性、清零或设置特定的位等。

20个位运算技巧

1. 判断奇偶性

要判断一个整数是奇数还是偶数,可以使用按位与运算符(&)来判断。如果整数的最后一位是0,则为偶数,否则为奇数。

if (n & 1):
    print("This is an odd number")
else:
    print("This is an even number")

2. 计算2的幂

如果一个整数是2的幂,则它的二进制数中有且只有一个1。使用按位与运算符(&)可以判断是否是2的幂。

if (n & (n - 1) == 0):
    print("This is a power of 2")
else:
    print("This is not a power of 2")

3. 交换两个数

使用位运算可以在不定义临时变量的情况下,交换两个数的值。

a = 5  # 二进制:0101
b = 3  # 二进制:0011
a ^= b
b ^= a
a ^= b
print(a)  # 二进制:0011,即3
print(b)  # 二进制:0101,即5

4. 取整

位运算可以进行位运算取整,相当于数学中的除法取整。

n = 15
print(n >> 1)  # 7,相当于数学中的n // 2

5. 乘以2

要实现一个整数乘以2的操作,可以通过左移运算符(<<)实现。

n = 10
print(n << 1)  # 20,相当于数学中的n * 2

6. 除以2

要实现一个整数除以2的操作,可以通过右移运算符(>>)实现。

n = 10
print(n >> 1)  # 5,相当于数学中的n // 2

7. 取绝对值

对于一个32位带符号整数,可以通过位运算计算它的绝对值。先将这个数与0x80000000进行异或运算,然后再加上0x80000000,即可得到它的绝对值。

n = -10
abs_value = (n ^ 0x80000000) + 0x80000000
print(abs_value)  # 10

8. 取反

运用异或运算可以实现高效地取反操作。

n = 10
print(~n)  # -11,相当于数学中的-(n + 1)

9. 取模

如果一个整数n是2的幂,则将n对2的幂-1取模可以实现和n取模相同的效果。

n = 16
print(n % 15)  # 1,相当于n % (2的幂-1)

10. 判断整数的符号

通过位运算可以判断一个整数的符号。如果一个整数的最高位为1,则它为负数;如果为0,则为正数。

n = -10
if n & 0x80000000:
    print("This is a negative number")
else:
    print("This is a positive number")

11. 求最大值

通过位运算可以求出多个整数中的最大值。

a = 10
b = 15
max_value = a ^ ((a ^ b) & -(a < b))
print(max_value)  # 15

12. 求最小值

通过位运算可以求出多个整数中的最小值。

a = 10
b = 15
min_value = b ^ ((a ^ b) & -(a < b))
print(min_value)  # 10

13. 求平均值

通过位运算可以求出多个整数的平均值,相当于数学中的整数除法的结果。

a = 10
b = 15
avg_value = (a + b) >> 1
print(avg_value)  # 12,相当于(a + b) // 2

14. 求异或和

通过位运算可以求出多个整数的异或和。

a = 10
b = 15
xor_sum = a ^ b
print(xor_sum)  # 5,相当于a ^ b

15. 从低位到高位获取位

通过位运算可以获取一个整数的二进制表示中某个位的值。

n = 10  # 二进制:1010
print(n & 1)        # 0,第0位的值为0
print((n >> 1) & 1) # 1,第1位的值为1
print((n >> 2) & 1) # 0,第2位的值为0
print((n >> 3) & 1) # 1,第3位的值为1

16. 清零

将一个整数的某些位清零,可以通过与一个全为1、要清零的位为0的整数进行按位与运算来实现。

n = 10  # 二进制:1010
n &= ~(1<<2)  # 清零第2位
print(n)      # 二进制:1000,即8

17. 设置位

将一个整数的某些位设置为1,可以通过与一个全为0、要设置的位为1的整数进行按位或运算来实现。

n = 10  # 二进制:1010
n |= (1<<2)  # 将第2位设置为1
print(n)     # 二进制:1010,即10

18. 判断是否为2的幂

通过位运算可以判断一个整数是否为2的幂。如果一个整数n是2的幂,则n & (n - 1)的结果为0。

n = 16
if (n & (n - 1) == 0):
    print("This is a power of 2")
else:
    print("This is not a power of 2")

19. 求补码

求补码可以通过将一个整数取反并加1来实现。

n = -10
complement_value = ~n + 1
print(complement_value)  # 10

20. 获取整数的二进制表示中1的个数

获取一个整数的二进制表示中1的个数,可以通过循环计算每个二进制位是否为1来实现。也可以使用Brian Kernighan算法来实现。

n = 10  # 二进制:1010
count = 0
while n:
    n &= (n - 1)
    count += 1
print(count)  # 二进制中1的个数为2

结语

位运算作为一种高效的运算方法,在计算机领域得到广泛应用。掌握这20个位运算技巧,将提高程序员的编码能力和效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:优秀程序员必须知道的20个位运算技巧 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Qt实战案例之如何利用QProcess类实现启动进程

    来讲一下“Qt实战案例之如何利用QProcess类实现启动进程”的攻略,这个过程包含以下几个步骤: 1. 理解QProcess类 QProcess是Qt中用于启动外部进程的类,它提供了很多与进程相关的功能,例如启动进程、向进程发送信号、获取进程输出等等。 2. 使用QProcess启动进程 要使用QProcess启动进程,我们需要先创建一个QProcess对…

    C 2023年5月23日
    00
  • PHP中常见的密码处理方式和建议总结

    PHP中常见的密码处理方式和建议总结 在PHP中,密码处理是一个重要的安全问题。本文将介绍PHP中常见的密码处理方式和建议总结。 常见的密码处理方式 明文存储 明文存储是最不安全的方式,它直接将用户的密码以明文形式存储在数据库中,容易被黑客猜测和盗取,不建议使用。 MD5加密 MD5是一种常用的哈希算法,可以将字符串转换为长度固定的哈希值。使用MD5加密用户…

    C 2023年5月23日
    00
  • R语言的一个加法函数使用介绍

    当使用R语言进行数据分析和可视化时,经常需要编写一些自定义函数来增强数据操作的效率和可重复性。这里我为大家介绍一个R语言的加法函数,帮助大家了解如何自定义函数并灵活运用。 函数定义 首先定义一个简单的加法函数,用于计算两个数的和。 add <- function(x, y) { return(x + y) } 这里使用了R语言的函数声明语法,将函数名设…

    C 2023年5月22日
    00
  • VSCode搭建STM32开发环境的方法步骤

    下面我将详细讲解“VSCode搭建STM32开发环境的方法步骤”。本攻略主要分为以下四个步骤:安装基础工具、配置VSCode环境、安装STM32插件和调试程序。 步骤一:安装基础工具 在搭建STM32开发环境前,我们需要安装以下几个工具: 集成开发环境(IDE):STM32CubeIDE、Keil、IAR、System Workbench for STM32…

    C 2023年5月22日
    00
  • 浅谈Spring @Async异步线程池用法总结

    针对“浅谈Spring @Async异步线程池用法总结”的主题,我将详细讲解如下: 1. 什么是Spring @Async异步线程池 在介绍 Spring @Async 异步线程池之前,我们需要先了解同步和异步的概念: 同步:就是一个任务执行完之后再执行下一个任务,任务按顺序一个接一个依次执行。 异步:与同步相反,异步任务的执行时间和顺序是不可预测的,任务的…

    C 2023年5月23日
    00
  • C语言实现的猜数字小游戏

    C语言实现的猜数字小游戏攻略 游戏规则 系统会在1~100之间随机生成一个整数,玩家需要猜测这个数字是多少。 玩家每次输入一个数字,系统会告诉玩家猜的数字是否正确,如果不正确,还会告诉玩家猜测的数字是偏大还是偏小。 玩家可以根据系统的提示,逐步缩小猜测范围,直到猜中为止。 玩家最多可以猜测7次,如果7次内未能猜中,游戏结束。 游戏实现步骤 首先需要生成一个1…

    C 2023年5月23日
    00
  • C++模拟如何实现vector

    C++ 的 vector 是一种非常常用的容器,可以动态地增加和减少容器的大小,而且支持迭代器进行遍历操作。下面是实现 vector 的大致思路: 维护一个动态分配的数组,用于存储元素。一开始先给数组申请一段较小的内存空间,以后随着元素的增加,当数组已满时再重新申请一段更大的内存空间,并将原先的元素复制到新的内存空间中。 记录当前存储的元素个数和数组的容量。…

    C 2023年5月22日
    00
  • strcmp,strcat,strstr模拟实现

    一、strcmp模拟实现 1.strcmp原理 2.基于其原理进行模拟实现 二、strcat模拟实现 1.strcat原理 2.基于其原理进行模拟实现 三、strstr模拟实现 1.strstr原理 2.基于其原理进行模拟实现 一、1. strcmp原理 strcmp进行字符串比较,将两个字符串进行比较,当src大于dest时,返回大于0的数,等于时返回0,…

    C语言 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部