c#中与Java无符号右移操作符>>>等价的是什么?
本文关键字:是什么 操作符 中与 Java 无符号 右移 | 更新日期: 2023-09-27 18:14:48
我正在尝试将一些Java代码转换为c#。下面的无符号右移操作如何在c#中表示?
int src1, src2, ans;
ans = src1 >>> src2;
必须先强制转换,>>>没有一个操作符,代码示例:
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开始,有一个本地>>>
操作符。参考官方文档