必备技能7.8 移位运算符
移位运算符>>和<<把变量的比特位按照指定的数量进行右移和左移。右移运算符的通用形式如下:
变量 >> 移动的位数
左移运算符的通用形式如下:
变量 << 移动的位数
其中的移动的位数表示的是需要向右或者向左移动的比特位的次数。每进行一次左移,就会把变量的所有比特位向左边移动一个比特位,并在最右边的比特位上填充0。每进行一次右移,就会把变量的所有比特位向右边移动一个比特位,并在最左边的比特位上填充0。然而,如果变量是一个有符号的整型数,并且是个负数,那么每右移一次就会在最左端填充1,这样可以在移位的过程中保留数值的符号。另外,移位运算不是循环移位的。也就是说被移出去的那一位不会回复到另一端的开始的。
移位运算符只能用于整型类型,例如int,char,long int,short int。它们不能应用于浮点类型。
移位运算符在对诸如数/模转换器之类外部输入设备的输入进行解码或者是读取状态信息的时候是非常有用的。我们还可以使用移位运算来进行快速的乘法或者除法运算。左移移位相当于是对这个数乘以2,右移一位相当于是对这个数除以2。
下面的程序演示了一位运算的效果:
// 演示移位
#include <iostream>
using namespace std;
void show_binary(unsigned int u );
int main()
{
int i = 1, t;
//左移
for ( t = 0; t < 8; t++)
{
show_binary(i);
i = i << 1;
}
cout << "/n";
//右移
for ( t= 0; t< 8; t++)
{
i = i >> 1;
show_binary(i);
}
return 0;
}
//显示一个字节中的比特位的值
void show_binary(unsigned int u )
{
int t;
for ( t = 128; t > 0; t = t/2 )
{
if ( u & t ) cout << "1 ";
else cout << "0 ";
}
cout << "\n";
}
程序的输出如下:
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 0
0 0 0 0 0 1 0 0
0 0 0 0 1 0 0 0
0 0 0 1 0 0 0 0
0 0 1 0 0 0 0 0
0 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 1
练习:
1。 位与,位或,非和异或的位运算符是什么?
2。 位运算符是基于比特位进行运算的,对吗?
3。 有一个整型数x,写出如何把x左移两个比特位?