簡體   English   中英

將二進制BIT轉換為數組的索引號-Swift

[英]Convert Binary BIT to an Index Number for Array - Swift

我需要一種在Swift中將array設置為索引號時確定或映射二進制BIT的方法。

例如,我有一個uInt64 ,它的BIT設置為0b0010 0000 0000 ... ,我想將其轉換為039范圍內的array的索引號。

因此, msb0 ,而lsb39

另外,我需要一種方法來識別已切換的最新位。

例如,假設第一個是: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM