X >>= N 是什么意思?

4

我有这样的代码:

tmp = (uint)len;
writer.CurPosition = value + 1;
do
{
    value++;
    writer.dest.WriteByte((byte)((tmp & 0x7F) | 0x80));
} while ((tmp >>= 7) != 0);

但我不明白 tmp >>= 7 是如何工作的?

2
对我来说看起来像是一个位移操作符。tmp被重新赋值为位移操作的结果。请参考这个问题https://dev59.com/cnRB5IYBdhLWcg3w77on - Alex
参见:https://dev59.com/q18e5IYBdhLWcg3wq75K#25495211 - serv-inc
3个回答

5
>>被称为右移位运算符。由于在>>后面有一个额外的=(形成一个复合赋值运算符>>=),因此被赋值赋值的变量(tmp)将会共享

换句话说,以给定的示例为例,

tmp >>= 7; //actually you use tmp both to assign and to be assigned

等同于

tmp = tmp >> 7; //actually you use tmp both to assign and to be assigned

现在谈一下按位移位操作,我认为最好通过例子来说明。
假设tmp的值为0xFF00(二进制表示为1111 1111 0000 0000),那么如果我们从按位运算的角度来看,>>=操作将会如下所示:
1111 1111 0000 0000 //old tmp
------------------- >> 7
0000 0001 1111 1110 //Shifted by 7 -> this is going to be the new value for tmp

因此,tmp 的新值将为 0x01FE(即 0000 0001 1111 1110)。

2

>> 是位移操作符。

tmp >>= 7 表示将 tmp 向右移动 7 位,并将其设置为该值。

循环将继续执行,直到 tmp 为零。


是的,我知道什么是位移,但这是我第一次看到它被重新分配。谢谢! - Vlad
@Vlad 可以将其视为 +=,只不过不是使用加法,而是使用位移操作。 - Nick Zuber

1
这实际上是C和C++的一部分,被称为复合赋值运算符
tmp >>= 7

等同于

tmp = tmp >> 7

使用>>作为按位右移

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