这是我今天看到的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
为什么输出是这样的?有人能解释一下吗?为什么我们想以这种方式使用它?我们喜欢做任何情况吗?
答案 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.