优秀程序员必须知道的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日

相关文章

  • 升级Win8.1后传统start开始菜单不见了如何找回

    针对“升级Win8.1后传统start开始菜单不见了如何找回”的问题,我来给出完整的攻略: 问题描述 在升级Windows 8.1之后,原本存在的传统start开始菜单不见了,这该如何找回? 解决步骤 1. 检查任务栏设置 有时传统start开始菜单的隐藏可能是由于任务栏设置所导致的。可以按照以下步骤进行设置: 鼠标右键点击任务栏,并选择“属性”选项; 在弹…

    C 2023年5月24日
    00
  • C程序 使用递归查找自然数之和

    C程序使用递归查找自然数之和 概述 递归是一种函数自我调用的方式,通过递归可以简洁地解决一些复杂的问题。在C语言中,可以使用递归实现查找自然数之和的功能,本文将详细介绍该功能的实现方法及使用攻略。 实现方法 使用递归计算自然数之和,需要使用到如下几个步骤: 判断递归终止的条件,通常是n变为0或1时返回相应的值。 使用函数自身进行递归调用,将n-1作为参数传入…

    C 2023年5月9日
    00
  • Vue项目报错:Uncaught SyntaxError: Unexpected token ‘<’的解决方法

    对于Vue项目中出现的“Uncaught SyntaxError: Unexpected token ‘<’”错误,一般是由于代码中使用了不符合Vue模板语法规则的字符或语法造成的。解决这种问题的方法如下: 第一步:排查代码中可能存在的错误。 1.1 首先打开Vue组件文件或模板文件,依次检查文件中使用的HTML标签、Vue模板指令以及自定义Vue组件是否符…

    C 2023年5月23日
    00
  • C++操作MySQL大量数据插入效率低下的解决方法

    下面是详细讲解“C++操作MySQL大量数据插入效率低下的解决方法”的完整攻略。 问题背景 当使用C++程序操作MySQL数据库时,可能会遇到插入大量数据的情况,例如插入100万行数据。如果使用简单的插入操作,效率非常低下,而且可能会导致程序崩溃或内存溢出。因此,需要一种高效的插入方式来解决这个问题。 解决方法 一种有效的解决方法是使用MySQL的批量插入功…

    C 2023年5月22日
    00
  • C++ 类this及返回自身对象的引用方式

    C++ 类this及返回自身对象的引用方式 this指针 每个非静态成员函数都有一个隐含的形参,即指向该类对象的指针。这个指针就是this指针。通过this指针,我们可以访问到类的所有成员变量和成员函数。 在C++中,关键字this用来指向当前对象。this指针是一个隐式参数,它在成员函数内部使用。 返回自身对象的引用 在C++中,返回自身对象的引用是一种常…

    C 2023年5月22日
    00
  • C 程序 计算并打印 nPr 的值

    要计算并打印出nPr的值,可以使用以下C代码实现: 编写代码 #include <stdio.h> #include <stdlib.h> int permutation(int n, int r){ int i, result=1; for(i=n; i>=n-r+1; i–) result*=i; return resul…

    C 2023年5月9日
    00
  • C语言中回调函数的使用详情

    回调函数是一种应用程序设计模式,通常在C语言中使用,用于将一个函数传递给另一个函数,以便后者在特定条件下调用前者。回调函数可以极大地提高程序的可扩展性和复用性。在这里,我们将详细讨论回调函数的使用方法,简单介绍一下回调函数的概念和用途,最后提供两个示例说明。 回调函数的概念和用途 回调函数是指在作为参数传递给另一个函数的函数。简单来说,回调函数是由另一个函数…

    C 2023年5月23日
    00
  • C语言自制测色弱找方块游戏的示例代码

    下面我来详细讲解“C语言自制测色弱找方块游戏的示例代码”的完整攻略。 程序简介 该程序是一款基于C语言编写的测色弱能力的小游戏,玩家需要在屏幕上找到某个特定颜色方块,并点击该方块。同时,该程序还能够较为准确地检测用户的色盲情况。如果用户识别出的颜色与程序给出的颜色不符,则会提示用户是否为色盲人士。 程序设计 程序主要由两个部分组成:图像处理和游戏逻辑处理。图…

    C 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部