我正在尝试将一些Java代码转换为C#。如何在C#中表示以下unsigned right shift operation?
int src1, src2, ans;
ans = src1 >>> src2;
答案 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#中,您只需将>>
与无符号类型一起使用-因此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;
}
}
答案 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;
}