gpt4 book ai didi

java - C# 中 Java 的 >>>= 是什么

转载 作者:行者123 更新时间:2023-12-02 02:46:31 25 4
gpt4 key购买 nike

我目前正在转换 Java 程序。我通过字节移位运算符来实现。

我想知道 >>>= 运算符在 C# 中的含义。只是 >>= 吗?>>= 在 C# 中会改变符号吗?

最佳答案

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

为了便于阅读,我已经写了这个长手,但是编译器对此进行了很好的优化 - 例如对于 int 版本:

.maxstack 8

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

(long 版本的唯一区别是它使用 63 而不是 31 进行掩码)

它们可以更简洁地写为:

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

关于java - C# 中 Java 的 >>>= 是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62709877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com