它在Kotlinfor &+和Swift中的等价物是什么

mnemlml8  于 2023-06-28  发布在  Swift
关注(0)|答案(4)|浏览(109)

这是Swift代码中的一行,我想在Kotlin中使用:

// var hash: UInt32 = 0
 hash = hash &+ UInt32(bytes[i])

它是按位添加数字,然后忽略溢出。
请参阅Swift语言文档中的“值溢出”:(https://docs.swift.org/swift-book/LanguageGuide/AdvancedOperators.html
但是,当您特别希望溢出条件截断可用位数时,您可以选择加入此行为,而不是触发错误。Swift提供了三个算术溢出运算符,它们可以选择整数计算的溢出行为。这些运算符都以&开头(&):

  • 溢出添加(&+
  • 溢流减影(&-
  • 溢出乘法(&*

Kotlin中的等价物是什么?我在官方文件里没看到。

k3bvogb1

k3bvogb11#

Kotlin不会在整数溢出时引发错误。Kotlin基于JVM,所以它也没有unsigned类型。所以你可以简单地添加这些值:

val hash : Int = ...
val bytes : ByteArray = ...
hash += bytes[i]

当然,Byte也是在Kotlin中签名的,所以在扩展它时可能需要进行值转换:

val byte : Byte = bytes[i]
val byteAsInt : Int = byte.toInt()
if (byteAsInt < 0) byteAsInt = 255 + byteAsInt + 1

hash += byteAsInt
c3frrgcw

c3frrgcw2#

没有像这样的操作符,但Kotlin可以做同样的事情:

val a: Byte = 100
val b: Byte = 121
val x: Byte = (((a + b) shl 8) shr 8).toByte()
println(x)

因此可以创建操作符:

infix fun Byte.`&+`(b: Byte): Byte = (((this + b) shl 8) shr 8).toByte()

然后这样使用:

val a: Byte = 100
val b: Byte = 121
val x: Byte = a `&+` b
println(x)
qf9go6mv

qf9go6mv3#

我计划使用我的Kotlin文件中的以下java代码:

public static byte addBytesWithOverflow(byte a, byte b) {
    int val = (a + b) & 0xFF;
    return (byte) val;
}
bt1cpqcv

bt1cpqcv4#

在我尝试了这么长时间之后,这对我很有效,我试图在与iOS hash =(hash << 5)&+ hash &+ Int(char.asciiValue!)

fun String.djb2() : Long {
    var hash : Long = 5381    
    for (char in this) {
     val code = char.toInt()
      hash = ((hash shl 5) + hash+code).toLong()      
    }
    return hash

}

相关问题