c++基础---之C++移位运算符

前言:
移位运算符可以把整型变量中的内容向左或向右移动指定的位数。移位运算符和其他按位运算符一起使用,可以获得前面描述的结果。>>运算符把位向右移动,<<运算符把位向左移动,移出变量两端的位被舍弃。
所有的按位操作都可以处理任何类型的整数,但本章的例子使用16位的变量,使例子较为简单。用下面的语句声明并初始化一个变量number:
unsigned short number=16387U;不带符号的字面量应在数字的最后添加字母U或u。
比如,在下面的语句中,对这个变量的内容进行移位,并存储结果:
unsigned short result = number <<2; //Shift left two bit positions
移位运算符的左操作数是要移位的值,右操作数指定要移动的位数。把数值16387向左移动两位,得到数值12。数值的这种剧烈变化是舍弃高位数字的结果。
 
正文:
(1)无符号整数的移位
把数值向右移动,可以使用下面的语句:
result = number >>2; //Shift right two bit positions
把数值16387向右移动两位,得到数值4096。向右移动两位相当于使该数值除以4。
 
只要没有舍弃位,向左移动n位就相当于把该数值乘以2的n次方。换言之,就等于把该数值乘以2 n。同样,向右移动n位就相当于把该数值除以2的n次方。但要注意,变量number向左移位时,如果舍弃了重要的位,结果就不是我们希望的那样了。可是,这与乘法运算并没有不同。如果把2字节的数值乘以4,就会得到相同的结果,所以向左移位和相乘仍是等价的。出现问题的原因是相乘的结果超出了2字节整数的取值范围。
 
如果需要修改原来的值,可以使用op= 赋值运算符。在这种情况下,可以使用>>=或<<=运算符。例如:
number >>= 2; // Shift contents of number two positions to the right
这等价于:
number =number >> 2; // Shift contents of number two positions to the right
这些移位运算符跟前面用于输入输出的插入和提取运算符有可能搞混。从编译器的角度来看,其含义一般可以从上下文中判断出来。否则,编译器就会生成一个消息,但用户需要非常小心。例如,如果输出变量number向左移动两位的结果,就应编写下面的代码:
cout << (number << 2);
其中,括号是必不可少的。没有括号,编译器就会把移位运算符解释为流插入运算符,从而得不到想要的结果。
 
(2)带符号的整数的移位
可以把移位运算符应用于带符号和不带符号的整型数。但是,向右移位运算符在带符号整数类型的操作随系统的不同而不同,这取决于编译器的实现。在一些情况下,向右移位运算符会在左边空出来的位上填充0。在其他情况下,符号位向右移动,在左边空出来的位上填充1。
移动符号位的原因是为了保持向右移位和除法运算的一致性。可以用char类型的变量来说明这一点,解释其工作原理。
假定把value定义为char类型,其初始值为–104(十进制):
signed char value=–104;
其二进制表示为10011000。
使用下面的操作把它向右移动两位:
value >>= 2; //Result 11100110
注释中显示了其二进制结果。右边溢出了两个0,因为符号位是1,就在左边空出来的位上填充1。该结果的十进制表示是–26,这正好是value的值除以4的结果。当然,对于不带符号的整数类型的操作,符号位不移动,在左边空出来的位上填充0。
 
前面说过,在向右移位负整数时,其操作是已定义好的,所以实现该操作时不一定要依赖它。因为在大多数情况下,使用这些运算符是为了进行按位操作,此时维护位模式的完整性是非常重要的。所以,应总是使用不带符号的整数,以确保避免高阶位的移位。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值