c++编程中的左移和右移操作

在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,保持符号位不变。

 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值