[英]Convert Binary BIT to an Index Number for Array - Swift
我需要一種在Swift中將array
設置為索引號時確定或映射二進制BIT的方法。
例如,我有一個uInt64
,它的BIT設置為0b0010 0000 0000 ...
,我想將其轉換為0
到39
范圍內的array
的索引號。
因此, msb
為0
,而lsb
為39
另外,我需要一種方法來識別已切換的最新位。
例如,假設第一個是: 0b0010 0000 0000 ....
,第二個是0x0010 0010 0000 ....
直到整數達到最大值,即0xFFFFFFFF..
更新 :
經過大量有用的反饋后,我還有另一個問題正在確定變量是否在Swift中發生了變化:
var changedValue: UInt64? {
willSet(newValue : UInt64) {
guard let oldValue = value, new = newValue else { return }
if oldValue != new { oldValue ^ newValue }
}
}
它不適用於UInt64
一種基本方法是將數字右移直到它變為零,並跟蹤執行該操作需要多少次:
func maskToIndex(_ mask: UInt64) -> Int {
var mask = mask
var result = 40
repeat {
mask >>= 1
result -= 1
} while mask != 0
return result
}
print(maskToIndex(0x0000000001)) // 39
print(maskToIndex(0x0000000002)) // 38
print(maskToIndex(0x0000000004)) // 37
print(maskToIndex(0x8000000000)) // 0
print(maskToIndex(0x4000000000)) // 1
print(maskToIndex(0x2000000000)) // 2
要確定最近打開的位,請對先前值和當前值應用異或運算以隔離新位:
let previous = 0b100
let current = 0b110
let newbit = previous ^ current // newbit = 2 = 0b010
XOR運算符可用於識別哪些位已更改:
let oldValue: UInt64 = 0b0010_0000_0000
let newValue: UInt64 = 0b0010_0010_0000
let diff = oldValue ^ newValue
ffsll()
(“找到第一個集合,很長很長”)函數計算設置為差值的最低有效位的位置:
let bitpos = Int(ffsll(Int64(bitPattern: diff)))
print(bitpos) // 6
如果最低有效位的變化對應於數組中的索引39,則計算
let index = 40 - bitpos
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.