2017-02-16 14 views
3

数式を解釈する助けが必要です。これは私が実験しているビーコンの文書からです。私はそれをスウィフトで書いたが、私はそれを働かせることはできない。どんなに温度変数がドキュメントから0ビーコンデータから値を読み取るSwiftのビット演算

として終わる値:

*は、主要なIDは、湿度の上位8ビットと温度の上位8ビット、および マイナーを放送しますIDは、次の2ビットの温度(合計10の最上位ビット)およびマイナーIDの14最下位ビット を、ユーザーによって構成された実際のマイナーとしてブロードキャストします。 湿度は合計8ビットで、温度は合計で10ビットです。

例:

だから、湿度:

uint16_t Humidity = Major(As Hex value) & 0xFF00; 

温度:本当にマイナー

uint16_t temperature = ((Major(As Hex value) & 0x00FF) << 8) & ((Minor(As Hex value) & 
0xC000) >> 8); 

uint16_t Real Minor = Minor(As Hex value) & 0x03FF; 

これは私が思い付いたとそれは正しいが、tと思われる彼は最後のビット単位に起因すると0 *

let majorAnd = UInt16(beacon.major) & 0x00FF 

    let majorShift = majorAnd << 8 



    let minorAnd = UInt16(beacon.minor) & 0xC000 

    let minorShift = minorAnd >> 8 



    let temperatureResult = majorShift & minorShift 

答えて

1

あなたの問題はここにある返します

let temperatureResult = majorShift & minorShift 

はに置き換えます

let temperatureResult = majorShift | minorShift 

ビットAND &は結果だけを与えるために起こっています2つのオペランドの間に共通のビットがある場合あなたのケースでは、それらは相互に排他的です。それらをビット単位OR |と組み合わせる必要があります。

値をシフトする方法にも問題があります。ここで修正されたソリューションです:

let majorAnd = UInt16(beacon.major) & 0x00FF 
let majorShift = majorAnd << 2 // make space for the last 2 bits 

let minorAnd = UInt16(beacon.minor) & 0xC000 
let minorShift = minorAnd >> 14 // shift off the unwanted 14 bits 

let temperatureResult = majorShift | minorShift 

あなたは同様にあなたの湿度をシフトする必要があります:ショートカットとして、あなたはスキップすることができ、上記の2つのシフト右>>例で

let humidity = UInt16(beacon.major) & 0xFF00 >> 8 

をとにかくそれらのビットが投げ込まれているので、マスキング:

let minorShift = UInt16(beacon.minor) >> 14 
let humidity = UInt16(beacon.major) >> 8 
+0

'|'がより適切でしょう。 '+'と同じ結果が起こるのは単なる流行です。 – Alexander

+0

@Alexanderは、 '|'がより適切であることに同意しました。編集されました。 – vacawama