什么是Java无符号右移运算符的C#等价物>>>

时间:2011-11-14 16:57:36

标签: c#

我正在尝试将一些Java代码转换为C#。如何在C#中表示以下unsigned right shift operation

int src1, src2, ans;
ans = src1 >>> src2;

5 个答案:

答案 0 :(得分:16)

您必须首先投射,没有一个运算符用于>>>,代码示例:

 int x = -100;
 int y = (int)((uint)x >> 2);
 Console.WriteLine(y);

答案 1 :(得分:7)

C#的>>运算符对运营商的签名状态(int vs uint)很敏感。如果您需要使用int,请先转换为unit

答案 2 :(得分:4)

我认为它只是>>是否签名取决于它是int / long还是uint / ulong,所以你必须根据需要进行投射

答案 3 :(得分:2)

Java中的>>>语法用于无符号右移,这是一个概念,因为Java 没有用于无符号整数的特定数据类型

但是,C#可以;在C#中,您只需将>>无符号类型一起使用-因此ulonguintushortbyte中的任何一个-并且它将执行预期的“用零填充MSB”行为,因为即使设置了输入MSB,这也是>> 对无符号整数所做的

如果您不想更改代码以始终使用无符号类型,则可以使用扩展方法:

public static int UnsignedRightShift(this int signed, int places)
{
    unchecked // just in case of unusual compiler switches; this is the default
    {
        var unsigned = (uint)signed;
        unsigned >>= places;
        return (int)unsigned;
    }
}
public static long UnsignedRightShift(this long signed, int places)
{
    unchecked // just in case of unusual compiler switches; this is the default
    {
        var unsigned = (ulong)signed;
        unsigned >>= places;
        return (long)unsigned;
    }
}

答案 4 :(得分:0)

您可以使用此方法代替operator >>>

int src1, src2, ans;
ans = rightMove(src1 , src2);

        int rightMove(int value, int pos)
        {
            if (pos != 0)
            {
                int mask = 0x7fffffff;
                value >>= 1;
                value &= mask;
                value >>= pos - 1;
            }
            return value;
        }