2017-02-16 3 views
3

Мне нужна помощь в интерпретации формулы. Это из документации маяка, с которым я экспериментирую. Я написал это в Swift, но я не могу заставить его работать. Независимо от значения переменной температуры не заканчивается как 0.Побитовые операции в Swift, значения считывания из данных маякового радиосигнала

Из документации:

* Основной ID транслирует наиболее значимые 8 бит влажности и наиболее значимых 8 бит температуры, и минор ID передает следующие 2 бита температуры (всего 10 самых значащих бит) и 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); 

Действительно Minor:

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 

побитовое И & только собирается дать результат когда между этими двумя операндами имеются биты. В вашем случае они являются взаимоисключающими, вы должны комбинировать их с поразрядным 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 

Вам нужно изменить свою влажность, а также:

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

В два сдвиге вправо >> случаев выше, как ярлык, вы можете пропустить маскировка, потому что эти биты все равно перебрасываются:

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

'' 'было бы более уместным. Это просто случайность, что '+' имеет тот же результат. – Alexander

+0

@ Александр, согласился, что '' 'более уместно. Ред. – vacawama

Смежные вопросы