0

这是我今天看到的一个 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);
}

我很好奇的是这里操作符 >> 的用法。我尝试了一个简单的程序并输入结果:

    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

为什么输出是这样的?谁能解释一下?为什么我们要以这种方式使用它?任何情况下我们更愿意这样做?

4

3 回答 3

4

它不是“提取运算符”,而是右移运算符,这就是>>C++ 开始发明疯狂的重载方法之前的含义。我猜pyr这是金字塔图像处理?想法是每i增加一,金字塔中的行数和列数减半。这是因为右移 i 基本上是除以 2^i (向下舍入)。

于 2013-06-27T16:48:58.873 回答
3

在您概述的情况下,>>代表right shift operator. 如果您考虑以二进制形式编写的整数:

01101= 13

>> i操作员将使上面的位移向正确的时间i。因此,当 时i = 2,以上将导致:

00011= 3

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

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

于 2013-06-27T16:49:11.813 回答
1

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

 int x = 4;
 int y = 1;

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

将产生 4 个右移 1 位,它应该显示值 2。

于 2013-06-27T16:49:28.637 回答