首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >>>>=在C#中来自Java是什么?

>>>=在C#中来自Java是什么?
EN

Stack Overflow用户
提问于 2020-07-03 06:46:00
回答 1查看 157关注 0票数 2

我目前正在转换一个Java程序。我通过字节移位操作符来。

我想知道>>>=操作符在C#中的意思。只是>>=吗?>>=在C#中移动标志了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-03 06:56:19

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

但是,C#会这样做;在C#中,您将只使用带有无符号类型的>> --因此任何ulonguintushortbyte --它都将执行预期的“使用零填充MSB”行为,因为这就是>>对无符号整数所做的操作,即使设置了输入MSB。

如果不希望在整个过程中将代码更改为使用无符号类型,则可以使用扩展方法:

代码语言:javascript
复制
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版本:

代码语言:javascript
复制
.maxstack 8

ldarg.0
ldarg.1
ldc.i4.s 31
and
shr.un
ret

( long版本的唯一不同之处在于它用63而不是31掩码)

它们可以写得更简洁些,如:

代码语言:javascript
复制
public static int UnsignedRightShift(this int signed, int places)
    => unchecked((int)((uint)signed >> places));
public static long UnsignedRightShift(this long signed, int places)
    => unchecked((long)((ulong)signed >> places));
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62709877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档