C++中用位运算代替取模运算

今天在刷题解的过程中看到了如下代码:

使用位运算代替取模运算旨在提高运行效率

在查阅资料后得知,a%b在b=2^n时,可以简化位a&(b-1);

当b=2^n时,b-1的二进制值也就是011...111(n位1),那么a&(b-1)也就是取a的后n位二进制值。也就是小于b的部分,也是a%b的值。

### C++ 中按位异或运算的使用方法 在 C++ 编程语言中,按位异或运算符 `^` 是一种二元运算符,它对两个整数类型的表达式执行逐位比较。当相应位置上的两位不同时返回 1,相同时返回 0。 #### 实现数值交换 可以利用按位异或运算来实现两个变量之间的值互换而不需借助临时存储空间: ```cpp #include <iostream> void swapValues(int& x, int& y) { std::cout << "Before swapping:\nx = " << x << "\ny = " << y << '\n'; // Swapping using XOR operation x ^= y; y ^= x; x ^= y; std::cout << "After swapping:\nx = " << x << "\ny = " << y << '\n'; } ``` 这段代码展示了如何仅依靠三个简单的语句完成两个整型变量间的值替换[^4]。 #### 查找数组中唯一出现两次的不同数字 另一个典型应用是在给定一个只含有重复偶次项以及一对单独存在的奇次数项(即恰好有两个不同的数各出现了单次)的序列时找出这两个特殊的元素: ```cpp #include <vector> using namespace std; void findUniqueNumbers(const vector<int>& nums, int& num1, int& num2) { int xorResult = 0; for (auto n : nums) xorResult ^= n; // Calculate the overall XOR of all elements unsigned setBitNo = xorResult & ~(xorResult - 1); num1 = num2 = 0; for (auto n : nums){ if ((setBitNo & n)) num1 ^= n; // One number with this bit as 1 will go here. else num2 ^= n; // Another number with this bit as 0 will come here. } } ``` 此函数接收一个整数向量作为输入参数并输出那两个唯一的非重复整数[num1,num2][^2]. ### 按位异或运算的特点 - **恒等性**: 对于任意整数 \(a\) ,有\(a \oplus 0 = a\)[^3]. - **自反性**: 当同一个操作数参与自身的按位异或计算时总是会得到零的结果,即对于所有的整数 \(a\) 都成立的是 \(a \oplus a = 0\). - **交换性和结合性**: 这意味着无论改变加括号的方式还是调整因子的位置都不会影响最终结果\[a \oplus b = b \oplus a,\quad(a \oplus b)\oplus c=a\oplus(b\oplus c)\]^. 这些属性使得按位异或成为了一种非常强大而灵活的操作,在许多场景下都能发挥重要作用,比如数据加密、错误检测等领域都有广泛的应用实例[^1].
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值