在C或C++中,">>="的含义是什么?

5
在C或C++中,“>>=”符号的含义是什么?它有特殊的名称吗?我有一段CUDA代码中的for循环如下:
for(int offset=blockDim.x; offset>0; offset >>=1)
{
   //Some code 
}

>>= 运算符是通过将变量右移指定的位数并将结果赋值给该变量来修改偏移量变量的。

4个回答

16

>>= 符号是右移的赋值形式,即 x >>= y; 相当于 x = x >> y;(除非被重载为其他含义)。

右移 1 位相当于除以 2。这段代码看起来像是有人不信任编译器去进行最基本的优化,而应该等同于:

for( int offset = blockDim.x; offset > 0; offset /= 2 ){ ... }

关于位操作的更多信息,请参考以下链接:

http://en.wikipedia.org/wiki/Binary_shift#Bit_shifts


鉴于在这种情况下,两个操作数都是int类型,因此可以排除使用重载运算符。 - celtschk
1
右移一位非常类似于除以2,但是对于负数由于整数除法的舍入规则,可能会得到略微不同的结果。在这个例子中,没有负数,所以它们是等价的。但是,在C和C++中,-3/2 == -1,而-3>>1 = -2。 - Adrian McCarthy

1

字面上来说 offset = offset >> 1,也就是说,offset 除以 2。


1

这是右移的赋值版本:

foo >>= 2; // shift the bits of foo right by two places and assign the result to foo

1

这是一个位移右运算符。它将变量的位向右移动,移动的位数由右操作数的值决定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接