2016-07-27 8 views
2

Ich muss diese Funktion ausführen, um das LSB aus einer vorzeichenlosen 64-Bit-Ganzzahl zu erhalten, aber die Operation schlägt fehl. Ich bin nicht sehr gut in bitweisen Operationen; Könnte mir jemand helfen?Absturz auf UInt64 bitweisem Betrieb in Swift

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

Vielen Dank.

+0

Ist da eine Nachricht mit dem Absturz? –

+0

Gibt es einen Parameter namens "ID" fehlt? – swdev

+0

Die Ausführung wurde unterbrochen, Grund: EXC_BAD_INSTRUCTION (Code = EXC_I386_INVOP, Subcode = 0x0). – lucamegh

Antwort

5

Sie müssen Überlauf in 3 Arten von Operationen vermeiden:

  • UInt64 zu Int64
  • Negation
  • Int64 zu UInt64

Alle oben überzulaufen freien Betrieb geändert, Ihre Code wird als:

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

Wenn Sie versuchen, das LSB Sie können einfach zu erhalten tun:

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

Das Ergebnis wird mit nur ein UInt64 sein LSB.

+1

Ja OP verwendete verwirrende Terminologie dort, er isoliert das niedrigste gesetzte Bit, nicht das LSB. – harold

+0

@harold Es ist möglich. Ich fand dieses Stück Code in einem größeren Rahmen, den ich versuche zu beheben ... – lucamegh

+0

Wie auch immer: Binärer Operator '&' kann nicht auf Operanden vom Typ 'Int64' und 'UInt64' @Matan – lucamegh