在C++编程中,左移(left shift)和右移(right shift)操作是对二进制数进行位移操作的基本方法。它们通过移动二进制位的位置来实现不同的功能,通常用于位运算和优化计算。以下是左移和右移操作的详细说明:
左移操作
左移操作使用符号 <<
,将操作数的二进制位向左移动指定的位数。左移操作会将低位补0。
result = operand << n;
operand 是要进行左移操作的整数。
n 是要左移的位数。
result 是左移后的结果。
#include <iostream>
using namespace std;
int main() {
int a = 5; // 二进制:0000 0101(共32位,这里省略前面的0,仅写8位)
int b = a << 2; // 左移2位,结果为:0001 0100 (十进制20)
cout << "a << 2 = " << b << endl; // 输出:20
return 0;
}
左移的效果:
每向左移一位,相当于乘以2。例如,5 << 1 结果是 10,5 << 2 结果是 20。
还有一个细节需要注意:左移操作会影响符号位,这可能导致符号变化,需要谨慎使用左移操作,特别是在处理有符号整数时。
#include <iostream>
using namespace std;
int main() {
int a = 10;//00000000 00000000 00000000 00001010
int b = a << 1; // 左移1位,00000000 00000000 00000000 00010100 , 结果为20
int c = a << 30; // 左移30位,10000000 00000000 00000000 00000000, 结果为-2147483648
cout << "a << 1 = " << b << endl;
cout << "a << 30 = " << c << endl;
// 输出
// a << 1 = 20
// a << 30 = -2147483648
return 0;
}
右移操作
右移操作使用符号 >>
,将操作数的二进制位向右移动指定的位数。右移操作的具体行为取决于操作数的类型(无符号或有符号)和编译器的实现。
语法:
result = operand >> n;
operand 是要进行右移操作的整数。
n 是要右移的位数。
result 是右移后的结果。
#include <iostream>
using namespace std;
int main() {
int a = 20; // 二进制:0001 0100
int b = a >> 2; // 右移2位,结果为:0000 0101 (十进制5)
cout << "a >> 2 = " << b << endl; // 输出:5
return 0;
}
正整数或者无符号数右移效果:
对于正整数或者无符号整数,右移操作会将高位补0。每向又移一位,相当于除以2并向下取整。
负数或者有符号数右移效果:
对于有符号整数,右移操作(>>
)可能是算术右移或逻辑右移,这取决于编译器和具体实现。多数现代编译器对有符号整数进行算术右移,即高位用符号位填充。这意味着如果数是正的,补0;如果数是负的,补1。在老师的dec c++中进行的是算术右移。
#include <iostream>
using namespace std;
int main() {
int a = -20; // 二进制表示(假设32位系统):11111111 11111111 11111111 11101100
int b = a >> 2; // 右移2位,结果为:11111111 11111111 11111111 11111011
cout << "a >> 2 = " << b << endl; // 输出:-5
return 0;
}
在这个例子中,-20
的二进制表示是 11111111 11111111 11111111 11101100
。右移两位后,结果是 11111111 11111111 11111111 11111011
,即 -5
。可以看到高位补的是 1
,保持符号位不变。