位运算 Bit Operation

本文探讨了位运算在解决算法问题中的各种应用,包括最大异或乘积、数字位运算、格雷编码转换等。文章通过具体题目介绍了如何使用位运算技巧解决编程挑战,如删除有序数组中的重复项、找到最接近目标值的函数值等,并讨论了在处理二进制和十六进制转换、按位或操作等问题时的位运算策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二进制常用计算

n - 1   // 相当于从这个数字最右侧的一个 1 开始之后的所有位都取反
n & n - 1  // 移除低位的 1
(n & n -1) == 0 判断 k 是不是 2 幂次
n & -n         // 获取低位的 1,其中 -n = ~n + 1,6 & -6 = 2	
n >> i & 1 // 获取 n 二进制的第 i 位
n | 1 << i // 将 n 二进制的第 i 位设为 1
n ^ 1 // 改变奇偶性 +1 / -1

ASCII 的性质:

大写英文字母:其二进制从右往左第 6 个比特值一定是 0。
小写英文字母:其二进制从右往左第 6 个比特值一定是 1。
任何英文字母:其小写字母二进制低 5 位,一定和其大写字母二进制低 5 位相等。

ASCII 编码中,大小写字母之间的关系。它们的二进制表示中,除了最高的三位不同,剩余的五位是相同的。

‘a’ 的 ASCII 码值是 97,二进制表示为 011 00001。
‘A’ 的 ASCII 码值是 65,二进制表示为 010 00001。
它们的二进制表示的最高位之间的区别就是 32,即 2^5。31: 00011111

### C++ 中的位运算及其应用 #### 基本概念 C++ 提供了一组用于操作二进制数据的位运算符,这些运算符可以直接作用于整数类型的每一位。常见的位运算符包括按位与 (`&`)、按位或 (`|`)、按位异或 (`^`) 和移位运算符(左移 `<<` 和右移 `>>`)。通过掌握这些基本运算符的功能和用途,可以更高效地处理低级数据结构以及优化程序性能。 以下是几个核心的概念说明: - **按位与 (&)** 运算规则为:只有当两个相应的二进制位都为 1 时,结果才为 1;否则为 0。此运算常用来清除某些特定位置上的比特值[^2]。 - **按位或 (|)** 当任意一个对应的二进制位为 1,则该位置的结果即为 1;仅当两者皆为 0 才会得到 0 的结果。它通常被应用于设置指定位置上的比特值[^3]。 - **按位异或 (^)** 如果对应两比特不同则返回 1,相同则返回 0。这种特性使得它可以实现无临时变量交换数值或者检测奇偶校验等功能。 - **移位运算符** 左移 `<</code>` 将所有比特向高位移动指定位数,在低位补零;而右移 `>></code>` 则把它们朝低位推挤出去,并依据符号填充左侧空缺部分。这可用于快速乘除以2的操作。 #### 实际案例分析 下面给出一些实际应用场景中的例子来展示如何运用上述提到的各种位运算技巧解决问题: ##### 示例一: 检查某一位是否已开启(设定了) 假设我们有一个字节表示的状态标志status=8(decimal)=b'00001000'(binary),现在想知道它的第三位是不是已经打开(set)了? ```cpp #include <iostream> using namespace std; int main(){ unsigned char status = 8; if ((status & (1 << 2)) != 0){ cout<<"Third bit is set."<<endl; }else{ cout<<"Third bit isn't set."<<endl; } } ``` 这里利用了 `(1 << n)` 来构建只有一位有效(nth position has '1')其余全为‘0’的一个掩码(mask),再跟目标状态做AND操作即可判断相应的位置情况. ##### 示例二: 图像像素间的逻辑组合 考虑两张图片A,B尺寸大小完全一致的情况下的逐点计算过程如下所示: ```cpp void combineImages(const vector<vector<int>>& img1, const vector<vector<int>>& img2, vector<vector<int>>& resultImg){ for(int i=0;i<img1.size();i++){ for(int j=0;j<img1[i].size();j++){ // Perform bitwise AND between corresponding pixels. resultImg[i][j]=img1[i][j]&img2[i][j]; } } } ``` 注意这里的“operation”不同于传统意义上的加减法等数学定义下运算方式,而是基于图像灰度等级范围内的特殊定制化版本[^4]. #### 总结 通过对以上内容的学习可以看出,C++里的bitwise operations 不仅仅是理论层面的知识点积累更是实践当中不可或缺的技术手段之一. 它们能够帮助开发者深入理解计算机内部工作机制的同时也提供了更多可能性去创造更加精妙高效的解决方案.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值