关于右移运营商>>在C ++中

时间:2013-06-27 16:45:29

标签: c++

这是我今天看到的C ++程序:

for (int i = 0; i < LEVELS; ++i)
{
    int pyr_rows = rows >> i;      // what is the usage of >> i here ? 
    int pyr_cols = cols >> i;      // why we what to use it in this way.

    depths_curr_[i].create (pyr_rows, pyr_cols);
}

我很好奇的是使用运算符&gt;&gt;这里。我尝试了一个简单的程序并输入结果:

    int rows = 5;
int cols = 3;
for (int i=0; i<5; i++)
{
    int pyr_rows = rows >> i;
    std::cout << "current i is:" << i << std::endl;     
    std::cout << "pyr_rows is: " << pyr_rows << std::endl << std::endl;

    int pyr_cols = cols >> i;
    std::cout << "current i is:" << i << std::endl;
    std::cout << "pyr_cols is: " << pyr_cols << std::endl << std::endl;

}

结果是这样的:

current i is:0
pyr_rows is: 5

current i is:0
pyr_cols is: 3

current i is:1
pyr_rows is: 2          // from now on 
                        // the outputs of pyr_rows and pyr_cols are weird to me
current i is:1
pyr_cols is: 1           

current i is:2
pyr_rows is: 1          

current i is:2
pyr_cols is: 0

current i is:3
pyr_rows is: 0

current i is:3
pyr_cols is: 0

current i is:4
pyr_rows is: 0

current i is:4
pyr_cols is: 0

为什么输出是这样的?有人能解释一下吗?为什么我们想以这种方式使用它?我们喜欢做任何情况吗?

3 个答案:

答案 0 :(得分:4)

它不是“提取运算符”,它是右移运算符,这是{C}开始发明疯狂超载方法之前>>的含义。我猜测pyr这是金字塔图像处理吗?我们的想法是,每当i增加1时,金字塔中的行数和列数就会减半。那是因为i的右移基本上是一个除法(舍入)2 ^ i。

答案 1 :(得分:3)

如果您已概述,>>代表right shift operator。如果考虑以二进制形式编写的整数:

01101 = 13

>> i运算符会使上面的位向右移i次。因此,当i = 2时,上述结果会导致:

00011 = 3

这有效地将整数除以2的幂。结果最终舍入向下,因此3 >> 1等于1,但-3 >> 1等于-2。

这是arithmetic shift,这意味着前导位被填充,因此在移位(前导位1)后负数可以保持为负。有些语言还有>>>的{​​{1}}运算符,它总是用零填充前导位。

答案 2 :(得分:1)

它不是一个“提取运算符”,它是原始的按位移位(右)运算符,在任何人甚至考虑过制作C ++语言之前都是在C语言中。它现在被用作输入和输出文件的操作符。

 int x = 4;
 int y = 1;

 cout << (x >> y) << endl; 

将产生4位右移1位,应该显示值2.