Swift 无符号右移运算符'&燃气轮机&燃气轮机&燃气轮机';迅速地

Swift 无符号右移运算符'&燃气轮机&燃气轮机&燃气轮机';迅速地,swift,bit-manipulation,Swift,Bit Manipulation,您将如何在Swift中实现Java的无符号右移运算符的等价物 根据,无符号右移运算符“>>>”将零移到最左侧位置,而“>>”之后的最左侧位置取决于符号扩展 那么比如说, long s1 = (-7L >>> 16); // result is 281474976710655L long s2 = (-7L >> 16); // result is -1 为了在Swift中实现这一点,我将通过如下操作获取除符号位以外的所有位: let lsb

您将如何在Swift中实现Java的无符号右移运算符的等价物

根据,无符号右移运算符“>>>”将零移到最左侧位置,而“>>”之后的最左侧位置取决于符号扩展

那么比如说,

    long s1 = (-7L >>> 16); // result is 281474976710655L
    long s2 = (-7L >> 16); // result is -1
为了在Swift中实现这一点,我将通过如下操作获取除符号位以外的所有位:

    let lsb = Int64.max + negativeNumber + 1
请注意,该数字必须为负数!如果移位运算符溢出,应用程序会因EXC_BAD_指令而崩溃,这不是很好。。。 而且,我有意使用Int64。因为没有更大的数据类型,执行类似(1int32)的操作{ seed=(seed&*0x5deec66d&+0xB)和((1>>(48-Int64位)) 返回Int32(截断位模式:移位) }
Swift有无符号整数类型,因此不需要单独的无符号右移运算符。在Java中,这是一个选择,因为决定不使用无符号类型。

一个确定的方法是使用无符号整数类型的无符号移位操作:

infix operator >>> : BitwiseShiftPrecedence

func >>> (lhs: Int64, rhs: Int64) -> Int64 {
    return Int64(bitPattern: UInt64(bitPattern: lhs) >> UInt64(rhs))
}

print(-7 >>> 16) //->281474976710655
(使用
-7
进行位计数测试
16
似乎不是一个好例子,它会在16位右移时丢失所有有效位。)

如果要按自己的方式执行,则按位或缺失符号位不能是常数
0x4000000000000000
。当位计数==0时,它必须是0x8000_0000_0000_0000(该常数在Swift
Int64
中溢出),并且需要用相同的位进行逻辑移位

所以,你需要这样写:

infix operator >>>> : BitwiseShiftPrecedence

func >>>> (lhs: Int64, rhs: Int64) -> Int64 {
    if lhs >= 0 {
        return lhs >> rhs
    } else {
        return (Int64.max + lhs + 1) >> rhs | (1 << (63-rhs))
    }
}

print(-7 >>>> 16) //->281474976710655
中缀运算符>>>:按位移位接收
func>>>>(左:Int64,右:Int64)->Int64{
如果lhs>=0{
返回左侧>>右侧
}否则{
返回(Int64.max+lhs+1)>>rhs |(1>>>16)/->281474976710655

当您需要无符号移位操作时,使用无符号整数类型似乎要容易得多。

正是这样,这解决了Java的一个问题。Swift没有等价物,因为它没有相同的问题。太完美了!谢谢!您还让我意识到,为了避免截断时溢出,我可以使用以下初始化:Int32(TruncingBitPattern:)我之所以要看这个,是因为我实现了Java文档中指定的Java Random。
infix operator >>> : BitwiseShiftPrecedence

func >>> (lhs: Int64, rhs: Int64) -> Int64 {
  return Int64(bitPattern: UInt64(bitPattern: lhs) >> UInt64(rhs))
}
var seed: Int64 = 0
private func next(_ bits: Int32) -> Int32 {
    seed = (seed &* 0x5DEECE66D &+ 0xB) & ((1 << 48) - 1)
    let shifted : Int64 = seed >>> (48 - Int64(bits))
    return Int32(truncatingBitPattern: shifted)
}
infix operator >>> : BitwiseShiftPrecedence

func >>> (lhs: Int64, rhs: Int64) -> Int64 {
    return Int64(bitPattern: UInt64(bitPattern: lhs) >> UInt64(rhs))
}

print(-7 >>> 16) //->281474976710655
infix operator >>>> : BitwiseShiftPrecedence

func >>>> (lhs: Int64, rhs: Int64) -> Int64 {
    if lhs >= 0 {
        return lhs >> rhs
    } else {
        return (Int64.max + lhs + 1) >> rhs | (1 << (63-rhs))
    }
}

print(-7 >>>> 16) //->281474976710655