c#中与Java无符号右移操作符>>>等价的是什么?

本文关键字:是什么 操作符 中与 Java 无符号 右移 | 更新日期: 2023-09-27 18:14:48

我正在尝试将一些Java代码转换为c#。下面的无符号右移操作如何在c#中表示?

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

c#中与Java无符号右移操作符>>>等价的是什么?

必须先强制转换,>>>没有一个操作符,代码示例:

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

c#的>>运算符对运算符的签名状态敏感(int vs uint)。如果需要对int进行操作,请先转换为uint

我认为它只是>>是否有符号取决于它是int/long还是int/ulong,所以你必须在必要时强制转换

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

但是,c#可以;在c#中,您只需将>>unsigned类型一起使用-因此ulong, uint, ushort, byte中的任何一个-它将执行预期的"用零填充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;
    }
}

您可以使用此方法代替>>>操作符。

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;
        }

从c# 11开始,有一个本地>>>操作符。参考官方文档