2016-07-27 5 views
2

符号なし64ビット整数からlsbを取得するにはこの関数を実行する必要がありますが、操作は失敗します。私はビットごとの操作があまりよくありません。誰かが私に手を差し伸べるだろうかSwiftのUInt64ビット演算でクラッシュする

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

ありがとうございます。

+0

クラッシュのメッセージ? –

+0

"id"というパラメータがありませんか? – swdev

+0

実行が中断された、理由:EXC_BAD_INSTRUCTION(コード= EXC_I386_INVOP、サブコード= 0x0)。 – lucamegh

答えて

5

あなたが操作の3種類のオーバーフローを避けるために必要があります:あなた、すべての変更オーバーフローフリーのための操作上の

  • UInt64型のInt64
  • 否定
  • UInt64型
  • へのInt64

コードは次のようになります。

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

はいオペレーションが混乱して使用されましたが、彼はLSBではなく、最も低いセットビットを分離しています。 – harold

+0

@harold可能です。 – lucamegh

+0

とにかく: 'Int64'と 'UInt64'型のオペランドにバイナリ演算子 '&'を適用できません@Matan – lucamegh