2016-07-27 83 views
2

我需要執行此函數以從無符號的64位整數中獲取lsb,但操作失敗。我不擅長按位操作;有人能幫我一把嗎?Swift中的UInt64按位運算崩潰

func lsb(id: UInt64) -> UInt64 { 
    return UInt64(Int64(id) & -Int64(id)) 
} 

謝謝。

+0

Is there與崩潰的消息? –

+0

是否有一個名爲「id」的參數丟失? – swdev

+0

執行中斷,原因:EXC_BAD_INSTRUCTION(code = EXC_I386_INVOP,subcode = 0x0)。 – lucamegh

回答

5

你需要避免溢出3種類型的操作:

  • UINT64到Int64的
  • 否定
  • 的Int64到UINT64

以上所有變更爲溢出免費運營,您的代碼變爲:

func lsb(id: UInt64) -> UInt64 { 
    return UInt64(bitPattern: Int64(bitPattern: id) & (0 &- Int64(bitPattern: id))) 
} 
0

如果您想獲得LSB,你可以簡單地做:

func lsb() -> UInt64 { 
    return UInt64(UInt64(id) & UInt64(0x0000000000000001)) 
} 

結果將是隻用一個LSB​​ UINT64。

+1

是的OP在那裏混淆了術語,他將最低位置,而不是LSB隔離。 – harold

+0

@harold這是可能的。我發現這段代碼在一個更大的框架內,我試圖修復... – lucamegh

+0

無論如何:二進制運算符'&'不能應用於'Int64'和'UInt64'類型的操作數@Matan – lucamegh