Swift 无符号右移运算符'&燃气轮机&燃气轮机&燃气轮机';迅速地
您将如何在Swift中实现Java的无符号右移运算符的等价物 根据,无符号右移运算符“>>>”将零移到最左侧位置,而“>>”之后的最左侧位置取决于符号扩展 那么比如说,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
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(该常数在SwiftInt64
中溢出),并且需要用相同的位进行逻辑移位
所以,你需要这样写:
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