我從雙字解壓縮一些數據。使用6位設置浮點數的小數部分
unsigned char * current_word = [address of most significant byte]
我的第14個MSB是一個int值。我打算使用帶有0xFFFC的按位來提取它們。
int value = (int)((uint_16)current_word & 0xFFFC);
我的下一個6位是小數值。在這裏,我被困在一個有效的實現中。我可以一次提取一個位,然後構建分數1/2 *位+ 1/4 +位+1/8 *位等等,但這樣做效率不高。
float fractional = ?
最後12 LSB是另一個int值,這是我覺得我可以拉出來使用逐又一次。
int other_value = (int) ((uint_16)current_word[2] & 0x0FFF);
該操作將在16348雙字上完成,並且需要在0.05 ms內完成以至少運行20Hz。
我對位操作非常陌生,但我很高興能夠學習。閱讀材料和/或例子將不勝感激!
編輯:我寫了或當我的意思,
你將指向整數,不這樣做。而是將'char *'轉換爲'unsigned *'並將其解引用。另外,根據您使用的處理器,它看起來像顛倒了字節順序。在這種情況下,您需要分別抓取每個字節(或其中的一部分),並將它們移到正確的位置。 – 2012-01-30 22:04:49
我很困惑,你的靜態施法方法與我的方法有什麼不同? – Constantin 2012-01-30 22:08:47
你的第二行代碼評估'(uint_16)current_word'。 'current_word'是一個地址(見代碼的第一行),你從地址中獲取14位,而不是從數據中獲取。你需要'*(uint_16 *)current_word'。除了使字節順序錯誤。 – 2012-01-30 22:09:49