我正在将一些 C 代码转换为 Scala,因为我们正在(据称)进入企业大厦的现代世界,至少我是被告知的。
某些 C 代码使用无符号变量,这些变量对其执行了大量位级(移位)操作。
我对如何将它们转换为 Scala 完全处于停滞状态,因为我相信 Scala(和 Java)以及 JVM 确实发现了外来的无符号类型。
任何建议表示赞赏。
C 中的有符号和无符号数学与 JVM 上的唯一区别在于右移运算符。对于无符号数学,您可以使用逻辑移位(因为您不希望符号扩展),而对于有符号数学,您需要执行算术移位(保留标志)。这是它的美丽之一二进制补码算术 http://en.wikipedia.org/wiki/Two%27s_complement.
基于此,您所要做的就是更改 Java/Scala>>
运算符为>>>
运算符,您将得到相同的答案,一点一点。但是,根据您正在执行的操作,当您尝试对结果执行某些操作时,例如,可能仍然会出现问题。如果你想将其打印为无符号整数。
假设您想在 Scala 中使用“无符号”长整型进行一些数学计算,并在最后打印结果。只需使用普通的长,使用>>>
(逻辑移位) 运算符代替>>
,然后在最后将其转换为可以表示无符号值的其他内容。您可以使用 @rightfold 的答案中建议的库,或者您可以做一些简单的事情,如下所示:
val x = Long.MaxValue // declare my "unsigned" long
// do some math with it ...
val y = x + 10
// Convert it to the equivalent Scala BigInt
def asUnsigned(unsignedLong: Long) =
(BigInt(unsignedLong >>> 1) << 1) + (unsignedLong & 1)
x
// Long = 9223372036854775807
asUnsigned(y)
// res1: scala.math.BigInt = 9223372036854775817
如果你只是使用Int
s,那么你甚至不必转换为BigInt
自从a结束以来Long
可以保留答案。只需使用 @BrianRoach 在上面的评论中建议的方法来转换Int
的“无符号”值等于Long
通过屏蔽高阶字节。但是,再次强调,除非绝对必要,否则不应该进行转换。即使在 64 位处理器上使用 64 位 JVM,整数乘法和除法操作也会变慢Long
(64 位)比Int
(32 位)。 (有关更多详细信息,请参阅此问题:JVM 中 64 位整数的效率是否比 32 位整数低? https://stackoverflow.com/q/9605562/1427124).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)