2017-02-16 2 views
3

J'ai besoin d'aide pour interpréter une formule. C'est à partir de la documentation d'une balise que j'expérimente. Je l'ai écrit dans Swift mais je n'arrive pas à le faire fonctionner. Peu importe les valeurs de la variable de la température se termine comme 0.Opérations bit à bit dans Swift, lecture des valeurs à partir des données de balise

De la documentation:

* La principale ID diffuse les 8 bits les plus significatifs de l'humidité et les plus importantes 8 bits de la température et le mineur ID diffuse les 2 bits suivants de la température (pour un total des 10 bits les plus significatifs) et les 14 bits les moins significatifs de l'identificateur mineur comme réellement mineur configuré par l'utilisateur. Donc l'humidité est de 8 bits au total, et la température est de 10 bits au total.

Exemple:

donc l'humidité:

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

La température:

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

Le très mineur:

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

C'est ce que je suis venu avec et il semble correct mais t il résulte de la dernière opération de bits et retourne 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 

Répondre

1

Votre problème est ici:

let temperatureResult = majorShift & minorShift 

remplacer par:

let temperatureResult = majorShift | minorShift 

Bitwise ET & va seulement donner un résultat quand il y a des bits en commun entre les deux opérandes. Dans votre cas, ils sont mutuellement exclusifs, vous devez les combiner avec des bits OU |.

Il existe également un problème avec la manière dont vous modifiez les valeurs. Voici la solution corrigée:

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 

Vous aurez besoin de changer votre humidité ainsi:

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

Dans les deux cas >> décalage vers la droite au-dessus, comme un raccourci, vous pouvez sauter le masquage parce que ces bits sont de toute façon lancés:

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

'|' serait plus approprié. C'est juste un coup de chance que '+ 'arrive à avoir le même résultat. – Alexander

+0

@Alexander, a convenu que '|' est plus approprié. Édité. – vacawama