2017-02-16 46 views
3

我需要一些幫助來解釋公式。這來自我正在試驗的燈塔的文檔。我用Swift編寫了它,但是我無法實現它的工作。不管值的溫度可變最終成爲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; 

這是我想出了和這似乎是正確的,但噸他從過去的按位結果,並返回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 

代之以當兩個操作數之間有共同的位時。在你的情況下,它們是互斥的,你應該將它們與按位或|結合起來。

您改變數值的方式也存在問題。以下是更正後的解決方案:

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

@Alexander同意'''更合適。編輯。 – vacawama