位运算:左移(<<)与右移(>>)
位运算:左移(<<)与右移(>>)
掌握位运算:左移(<<)、右移(>>)的基本使用方法及原理。
移位把二进制整体平移。左移 x << k:左侧移出的位丢掉,右侧补 0,数值上相当于乘以 (2^k)(在不溢出的前提下)。右移 x >> k:右侧移出丢掉;对有符号整数,C++11 实现几乎都做算术右移(左侧补符号位),正数补 0、负数补 1,效果接近除以 (2^k) 并向负无穷取整。移位量必须落在类型宽度之内,否则行为未定义;认证标准写明考题不涉及未定义行为,因此合法题不会让你移 32 位或负数位。
三级常考:1 << n 表示 (2^n)、给一个数连写几次移位求值、判断左移是否「一定等价于乘 2」。编程里用 1 << k 构造第 k 位掩码,再与 &、| 配合取位、置位。认证标准规定考试时长为 120 分钟,口算时先画 8 位示意再翻译回十进制。
int x = 5; // 00000101
cout << (x << 2); // 20,即 00010100
cout << (20 >> 2); // 5
int mask = 1 << 3; // 第 3 位(从 0 计)为 1
cout << x << 2 会被解析成连续的流输出,要写移位必须加括号:cout << (x << 2)。
如果 a 和 b 均为 int 类型的变量,下列表达式不能正确判断“a 等于 b”的是( )。
原文保真说明:来源改写 1 处(照原卷保留,未作修改)
来源题面被改写标点选项 1
原卷作
((a >= b) && (a <= b)),常规写法应为(a >= b) && (a <= b)洛谷有题去掉了四个选项最外层括号;官方 PDF 第 3 页为 ((a >= b) && (a <= b)) 等,已按页面恢复。
已按官方原件恢复:现为原卷原文
在下列代码的横线处填写( ),可以使得输出是“20 10”。

#include <iostream>
using namespace std;
int main() {
int a = 10, b = 20;
a = (a << 8) | b;
______ // 在此处填入代码
cout << a << " " << b << endl;
return 0;
}
原文保真说明:来源改写 1 处(照原卷保留,未作修改)
来源题面被改写版式题干
原卷作
官方 PDF 第 3 页该程序是嵌入位图;已抽为 fig-02.png(宽 520),并保留洛谷转写的代码围栏供阅读。
已按官方原件恢复:现为原卷原文
在 C++ 语言中,所有 int 类型的值,经过若干次左移操作(<<)后,它们的值总会变为 0。
定义整数 int x = -5,则执行C++代码 cout << (x == (x << 1 >> 1)) 输出是( )。
对整型变量 int a = 3,执行 C++ 代码 a<<2 将把 2 输出到 a 中。( )
一个 int 类型变量 a,执行操作 (a<<2>>2) 后的值一定是 a。( )
下列代码的输出结果是( )。
#include <iostream>
using namespace std;
int main() {
int a = 12;
int result = a >> 2;
cout << result << endl;
return 0;
}
下列说法正确的是( )
原文保真说明:来源改写 1 处(照原卷保留,未作修改)
来源题面被改写错字选项 4
原卷作
(~0的输出值是1)洛谷有题写成 (~0) 的输出值是 1(补了右括号并加空格);官方 PDF 第 2 页印作 (~0的输出值是1),已按原卷恢复。
已按官方原件恢复:现为原卷原文
a=1010 1110,a << 2,下面关于这个说法正确的是( )。
补码 1111 1101 进行运算 1111 1101>>1 以后得到的结果是( )
x 是浮点数,(x >> 1) 等价于 x / 2。
下列代码段执行后,变量 sum 的值是( )
{
int sum = 0;
for (int i = 1; i <= 10; i++) {
if (i % 3 == 8>>2)
continue;
sum += i;
}
}
执行以下程序段,输出值是( )
int x = 5;
if (x == 3 >> 2) x = 8 >> 3;
cout << x << endl;
已知 unsigned char c = 0x0F; (十六进制 0F = 二进制 00001111),执行 c = c << 3; 后,c 的十进制值是:( )。
关于位运算,下列说法错误的是( )。
下列程序如果能够正确执行,那么输出的结果是 GESP。
int main() {
string name = "GESP";
cout << name[false] << name[true] << name[1 << 1] << name[7 >> 1] << endl;
}