当前位置: 首页 > news >正文

网站推广工作是在网站发布之后开展的龙海网络推广

网站推广工作是在网站发布之后开展的,龙海网络推广,wordpress如何加密,个人网站 商城 备案引言 在算法竞赛和底层开发中,位运算(Bit Manipulation)因其极高的执行效率而广受青睐。它能在O(1)时间复杂度内完成某些复杂操作,大幅优化程序性能。本文系统梳理C位运算的核心技巧,涵盖基础操作、经典应用、优化策略…

引言

在算法竞赛和底层开发中,位运算(Bit Manipulation)因其极高的执行效率而广受青睐。它能在O(1)时间复杂度内完成某些复杂操作,大幅优化程序性能。本文系统梳理C++位运算的核心技巧,涵盖基础操作、经典应用、优化策略及实战例题,帮助读者掌握这一高效工具。


一、位运算基础

1. 六大基本操作

运算符名称示例(二进制)说明
&按位与1010 & 1100 = 1000同1为1,否则为0
|按位或1010|1100 = 1110有1则1,全0为0
^按位异或1010 ^ 1100 = 0110不同为1,相同为0
~按位取反~1010 = 0101(4位)0变1,1变0
<<左移0011 << 2 = 1100低位补0,相当于×2ⁿ
>>右移1100 >> 2 = 0011高位补符号位(算术右移)

2. 常用位运算性质

  • 异或(XOR)特性

    • a ^ a = 0a ^ 0 = a

    • 交换律:a ^ b = b ^ a

    • 结合律:(a ^ b) ^ c = a ^ (b ^ c)

  • 与(AND)和或(OR)的分配律

    • a & (b | c) = (a & b) | (a & c)

    • a | (b & c) = (a | b) & (a | c)


二、位运算实战技巧

1. 判断奇偶

bool isOdd(int n) {return n & 1; // 奇数返回true
}

原理:二进制末位为1表示奇数。

2. 交换两个数(无需临时变量)

void swap(int &a, int &b) {a ^= b;b ^= a;a ^= b;
}

注意:若ab指向同一内存,此方法会失效。

3. 取绝对值

int abs(int n) {int mask = n >> (sizeof(int) * 8 - 1); // 符号位扩展return (n ^ mask) - mask;
}

适用场景:嵌入式设备等无分支优化需求。

4. 检查是否为2的幂

bool isPowerOfTwo(int n) {return n > 0 && (n & (n - 1)) == 0;
}

原理:2ⁿ的二进制形式为100...0n & (n-1)会消除唯一的1。

5. 统计二进制中1的个数(Brian Kernighan算法)

int countOnes(int n) {int count = 0;while (n) {n &= (n - 1); // 每次消除最右边的1count++;}return count;
}

时间复杂度:O(k),k为1的个数。

6. 最低位的1

int lowBit(int x) {return x & (-x);
}

应用:树状数组(Fenwick Tree)的核心操作。

7. 模拟集合操作

  • 表示集合:用整数二进制位表示元素是否存在(如mask = 5101)表示包含第0和第2个元素)。

  • 常用操作

    int S = 0b1010;          // 集合{1, 3}
    S |= (1 << 2);           // 添加元素2 → S = 0b1110
    S &= ~(1 << 1);          // 删除元素1 → S = 0b1100
    bool has = S & (1 << 3); // 检查元素3是否存在

三、位运算优化策略

1. 替代乘除法

  • 左移1位等价于×2:

    int a = 5;
    a <<= 1; // a = 10
  • 右移1位等价于÷2(向下取整):

    int b = 7;
    b >>= 1; // b = 3

2. 状态压缩DP

问题示例:旅行商问题(TSP)中,用二进制数表示访问过的城市。

int dp[1 << n][n]; // dp[mask][i]表示从城市i出发,访问过mask集合的最短路径
for (int mask = 0; mask < (1 << n); mask++) {for (int i = 0; i < n; i++) {if (mask & (1 << i)) {// 状态转移}}
}

3. 快速幂算法

int fastPow(int a, int b) {int res = 1;while (b) {if (b & 1) res *= a;a *= a;b >>= 1;}return res;
}

时间复杂度:O(log b)。


四、经典例题解析

例题1:只出现一次的数字(LeetCode 136)

问题:数组中只有一个数出现一次,其余均出现两次,找出该数。
解法

int singleNumber(vector<int>& nums) {int res = 0;for (int num : nums) res ^= num;return res;
}

关键点:利用a ^ a = 0的性质。

例题2:位1的个数(LeetCode 191)

问题:统计无符号整数的二进制表示中1的个数。
解法

int hammingWeight(uint32_t n) {int count = 0;while (n) {n &= (n - 1);count++;}return count;
}

例题3:子集生成(LeetCode 78)

问题:给定无重复元素的数组,返回所有子集。
位运算解法

vector<vector<int>> subsets(vector<int>& nums) {int n = nums.size();vector<vector<int>> res;for (int mask = 0; mask < (1 << n); mask++) {vector<int> subset;for (int i = 0; i < n; i++) {if (mask & (1 << i)) subset.push_back(nums[i]);}res.push_back(subset);}return res;
}

五、总结

位运算通过直接操作二进制位,能够实现:

  1. 高效数学运算(如乘除、取模);

  2. 状态压缩(优化DP、集合操作);

  3. 算法优化(快速幂、Brian Kernighan算法)。

掌握位运算,不仅能提升代码性能,还能在面试和竞赛中脱颖而出。建议通过LeetCode相关题目(如268371201)加强练习。

http://www.dtcms.com/a/487880.html

相关文章:

  • Debian12安装Docker、Docker-compose构建CICD
  • AI在物理实验教育中的应用探索
  • 第四章 决策树
  • 【算法】725.分割链表--通俗讲解
  • 哈尔滨网站seowordpress域名设置
  • kettle Spoon 数据库连接步骤详解
  • 网站建设要做什么网站美化
  • Springboot——使用shyiko监听mysql的bin-log
  • 英特尔Day0适配Qwen3-VL-4B/8B新模型,释放系统资源带来流畅体验
  • 深度解析TENGJUN JA017-BPD105-A-SLIP-RING 10极滑动环耳机插座
  • 网站建设培训学校北京怎么做外网的网站
  • 东方网站建设展馆设计网站推荐
  • 做战袍网站贪玩手游官方网站
  • excel做注册网站网站被墙是谁做的
  • 河北省城乡建设培训网官方网站wordpress 在线文章插件
  • n8n飞书节点知识空间中的多维表格 Token如何获取
  • 做外贸的人经常逛的网站网校网站建设
  • LLVM IR深度技术解析:架构、优化与应用
  • 网站建设+三乐衡水景县专业做淘宝网站公司
  • linux学习笔记(33)网络编程——HTTP协议
  • 守护线程,礼让线程,插入线程
  • 网站建设好不好北京数据优化公司
  • 网站建设服务非常好湖南岚鸿公司万网怎样安装wordpress
  • FPGA职位经典笔/面试题(附答案与解析)
  • 哪个网站百度收录快怎样免费安装wordpress
  • 给客户做网站建设方案推广计划地域设置的作用描述不正确的是
  • N8N 系列:入门级,告别 SQL “天书”!N8N原生数据表 Data Tables,让新手也能轻松管理数据,上手即会用
  • 整体设计 逻辑系统程序 之28 拼语言+ CNN 框架核心定位、三阶段程序与三种交换模式配套的方案讨论 之1
  • 谷歌自建站和优化中国对外贸易公司排名
  • 网站被百度k掉怎么办手机网站制作方案