legongju.com
我们一直在努力
2025-01-12 20:00 | 星期天

C++位运算技巧咋运用

C++中的位运算符允许你直接操作二进制位,这可以提高程序的性能,减少内存使用,并且有时可以使代码更加简洁和高效。以下是一些常见的位运算技巧及其在C++中的应用:

  1. 按位与(&):对应位都为1时结果为1,否则为0。
  2. 按位或(|):对应位有一个为1时结果为1,否则为0。
  3. 按位异或(^):对应位不同时结果为1,相同时为0。
  4. 按位取反(~):将每一位二进制数值取反,即0变为1,1变为0。
  5. 左移(<<):将位向左移动指定的位数,右边空出的位用0填充。
  6. 右移(>>):将位向右移动指定的位数,对于无符号数,左边空出的位用0填充;对于有符号数,行为依赖于具体的实现,可能是填充0(逻辑右移),也可能是填充符号位(算术右移)。
  7. 位运算符的组合使用:可以通过组合使用上述位运算符来实现更复杂的功能,如检查一个数的奇偶性(num & 1)、计算一个数的二进制表示中1的个数(通过循环和位运算实现)等。

以下是一些位运算技巧的具体应用示例:

1. 检查奇偶性

int num = 15;
bool isEven = !(num & 1); // true, 因为15的二进制是1111,最后一位是1,所以是奇数

2. 计算二进制表示中1的个数

int num = 15;
int count = 0;
while (num) {
    count += num & 1; // 如果最后一位是1,计数加1
    num >>= 1; // 右移一位
}

3. 快速幂算法

位运算可以用于实现快速幂算法,从而高效地计算a^n % mod

int fastPower(int base, int exponent, int mod) {
    long long result = 1;
    base = base % mod;
    while (exponent > 0) {
        if (exponent % 2 == 1) { // 如果当前位是1
            result = (result * base) % mod;
        }
        exponent = exponent >> 1; // 右移一位
        base = (base * base) % mod; // 平方
    }
    return static_cast(result);
}

4. 交换两个变量的值

不需要使用临时变量就可以交换两个变量的值。

int a = 5, b = 7;
a = a ^ b; // a现在是12 (二进制0110)
b = a ^ b; // b现在是5 (二进制0101)
a = a ^ b; // a现在是7 (二进制0111)

5. 使用位掩码进行权限控制

#define PERMISSION_READ 0b0001 // 二进制0001
#define PERMISSION_WRITE 0b0010 // 二进制0010
#define PERMISSION_EXECUTE 0b0100 // 二进制0100

int main() {
    int permissions = PERMISSION_READ | PERMISSION_WRITE; // 二进制0011
    if ((permissions & PERMISSION_READ) == PERMISSION_READ) {
        // 有读权限
    }
    return 0;
}

6. 使用位运算优化数组排序

位运算可以用于优化某些特定类型的数组排序,例如整数数组。

void sortArray(int* arr, int size) {
    for (int i = 0; i < size - 1; ++i) {
        for (int j = 0; j < size - i - 1; ++j) {
            if ((arr[j] & 0x55555555) > (arr[j + 1] & 0x55555555)) { // 使用0x55555555(二进制10101010...)进行比较
                std::swap(arr[j], arr[j + 1]);
            }
        }
    }
}

7. 使用位运算优化字符串处理

位运算可以用于字符串的某些操作,例如检查子串是否存在。

bool containsSubstring(const std::string& str, const std::string& substr) {
    if (substr.size() > str.size()) return false;
    for (size_t i = 0; i <= str.size() - substr.size(); ++i) {
        bool match = true;
        for (size_t j = 0; j < substr.size(); ++j) {
            if ((str[i + j] & ~substr[j]) != str[i + j]) { // 检查字符是否匹配
                match = false;
                break;
            }
        }
        if (match) return true;
    }
    return false;
}

8. 使用位运算优化内存使用

位运算可以用于优化内存使用,例如通过位字段来存储多个布尔值。

struct Flags {
    unsigned int isEnabled : 1; // 二进制0001
    unsigned int isActive : 1; // 二进制0010
    // ...其他标志位
};

9. 使用位运算优化循环

位运算可以用于优化循环,例如通过位掩码来控制循环的执行次数。

int countBits(int num) {
    int count = 0;
    while (num) {
        count += num & 1; // 如果最后一位是1,计数加1
        num >>= 1; // 右移一位
    }
    return count;
}

10. 使用位运算优化条件判断

位运算可以用于优化条件判断,例如通过位掩码来检查多个条件是否满足。

int checkAccess(int permissions, int requiredPermissions) {
    return permissions & requiredPermissions; // 检查是否有权限
}

通过合理使用这些位运算技巧,你可以在C++中编写出更加高效和简洁的程序。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/14661.html

相关推荐

  • C#中token是什么及其作用

    C#中token是什么及其作用

    在C#中,token通常指的是一个代表特定字符串或数据的标识符 身份验证和授权:在许多Web应用程序和API中,使用令牌(如JWT,JSON Web Token)进行身份验证和授权。...

  • 在C#中如何对token进行加密

    在C#中如何对token进行加密

    在C#中,对token进行加密通常使用的是对称加密算法,如AES(Advanced Encryption Standard)。以下是一个使用AES加密和解密token的示例:
    首先,需要引入Sy...

  • C#中token传递方式有哪些

    C#中token传递方式有哪些

    在C#中,token传递方式主要有以下几种: 查询字符串(Query String):将token作为URL的一部分,通过查询字符串传递。这种方式简单易用,但不太安全,因为URL可能...

  • C#中token与session的对比

    C#中token与session的对比

    在C#中,Token和Session都是用于身份验证和授权的技术,但它们之间存在一些关键区别。 存储方式: Token:通常以JWT(JSON Web Token)形式存储在客户端,如Web浏...

  • C++位运算规则如何理解

    C++位运算规则如何理解

    C++中的位运算符是对整数在二进制位上进行操作的运算符。理解位运算规则首先需要了解整数的二进制表示以及位运算符的作用。 整数的二进制表示:在C++中,整数是以...

  • C++位运算有哪些常见应用

    C++位运算有哪些常见应用

    C++中的位运算符主要用于对二进制位进行操作。以下是一些常见的C++位运算及其应用: 按位与(&):当两个相应的二进制位都为1时,结果为1,否则为0。应用场景包括...

  • C++位运算怎样快速掌握

    C++位运算怎样快速掌握

    要快速掌握C++位运算,请遵循以下步骤: 了解位运算的基本概念:位运算是对二进制数进行的操作,它直接对一个数值的二进制形式进行操作。位运算符用于执行按位与...

  • C++容器学习资料在哪

    C++容器学习资料在哪

    C++容器学习资料可以从多个途径获取,以下是一些建议的学习资源: C++标准库文档: C++标准库的官方文档是学习容器的重要资源。它详细描述了每个容器的功能、用法...