位运算:异或(^)
位运算:异或(^)
掌握位运算:异或(^)的基本使用方法及原理。
异或按位比较:相同得 0,不同得 1。它满足交换律、结合律,并且有三条常用恒等式:a ^ 0 == a(与 0 异或不变)、a ^ a == 0(自己与自己得 0)、a ^ b ^ b == a(异或两次等于没做)。因此可以用异或「翻转指定位」或在不借助第三变量时交换两个整数(注意两变量不能是同一对象)。
三级客观题常给三个数连写 ^,考结合顺序与结果;判断题会问「异或能否当逻辑或用」「a ^ a 是否恒为 0」。编程题里,一串数里只有一个出现奇数次、其余成对出现时,全部异或即可找出那个数——这是教学上的典型用法,规模在三级范围内。不要把 ^ 写成幂运算;C++ 里乘方要用循环或 pow。
int a = 5, b = 3; // 0101 ^ 0011 = 0110
cout << (a ^ b); // 6
a = a ^ b;
b = a ^ b;
a = a ^ b; // 交换后 a==3, b==5
连写多个 ^ 时从左到右算即可;不要先把十进制当「数字形状」去比,必须先化成二进制再对位。
一个 int 类型的值,做以下哪个操作,一定会变回原来的值?( )
如果 a 和 b 均为 int 类型的变量,下列表达式能正确判断 “a 等于 b” 的是( )。
原文保真说明:来源改写 1 处(照原卷保留,未作修改)
来源题面被改写多余符号选项 1
原卷作
((a / b) == 1),常规写法应为(a / b) == 1洛谷有题吃掉最外层括号;官方 PDF 第 4 页四选项均为 ((…))。已按页面图像恢复。
已按官方原件恢复:现为原卷原文
在下列代码的横线处填写( ),可以使得输出是 “24 12”。
#include <iostream>
using namespace std;
int main() {
int a = 12, b = 24;
________; // 在此处填入代码
a = a ^ b;
b = a ^ b;
cout << a << " " << b << endl;
return 0;
}
下列代码的输出结果是( )。
#include <iostream>
using namespace std;
int main() {
int a = 5;
int b = 10;
a = a ^ b;
b = a ^ b;
a = a ^ b;
cout << "a = " << a << ", b = " << b << endl;
return 0;
}
下列代码实现的是( )
void Swap(int &a, int &b) {
if (a != b) {
a ^= b;
b ^= a;
a ^= b;
}
}
以下代码的说法正确的是什么( )
#include <iostream>
using namespace std;
int main() {
int a = 0b1101;
int b = 0b1011;
cout << (a ^ b);
return 0;
}
以下哪个位运算可以交换两个变量的值(无需临时变量)( )
a & b | (c ^ d),其中 a=3,b=7,c=15,d=4,计算结果是( )
a,b 是整型变量,各自有互不相同的初始值。下列程序实现了什么效果( )。
a=a^b;
b=a^b;
a=a^b;
原文保真说明:来源改写 1 处(照原卷保留,未作修改)
来源题面被改写版式题干
原卷作
a=a^b;,常规写法应为a=a^b;洛谷在 ^ 两侧加了空格;官方 PDF 第 1 页为 a=a^b;。列位闸门按原件恢复。
已按官方原件恢复:现为原卷原文