我正在将一些C代码转换为Scala,因为我们正在(据称)进入企业塔中的现代世界,或者我已经被告知了.
一些C代码使用无符号变量,这些变量对它们执行了大量的位级(移位)操作.
我完全停止了如何将这些转换为Scala,因为我相信Scala(和Java)以及JVM确实发现了无符号类型.
任何建议表示赞赏
Dao*_*Wen 22
在C语言和JVM上签名的无符号数学之间的唯一区别是右移运算符.对于无符号数学,您使用逻辑移位(因为您不需要符号扩展),而对于有符号数学,您可以进行算术移位(保留符号).这是二进制补码算法的优点之一.
基于此,您所要做的就是更改>>运算符的Java/Scala 运算>>>符,并逐位获得相同的答案.但是,根据您正在进行的操作,当您尝试对结果执行某些操作时可能仍会出现问题,例如,如果要将其打印为无符号整数.
假设您想在Scala中使用"unsigned"long进行一些数学计算,并在结尾处打印结果.只需使用普通的long,使用>>>(逻辑移位)运算符代替>>,然后将其转换为可以表示无符号值的末尾的其他内容.您可以使用@ 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
Run Code Online (Sandbox Code Playgroud)
如果你只是使用Ints,那么你甚至不必转换到BigInt最后,因为一个Long可以得到答案.只需使用@BrianRoach在上面的评论中建议的方法,通过屏蔽高阶字节将Int's"无符号"值转换为等效值Long.但是,再次,您绝不应该进行转换.即使在64位处理器上使用64位JVM,Long(64位)的整数乘法和除法运算也会比Int(32位)慢.(有关更多详细信息,请参阅此问题:64位整数的效率是否低于JVM中的32位整数?).
| 归档时间: |
|
| 查看次数: |
15332 次 |
| 最近记录: |