Python中整數移位及二進位制串操作
Python中整數移位及二進位制串操作
最近一個專案涉及到電壓資料的接收和視覺化處理。其中電壓資料是由FPGA
通過TCP
協議傳輸的二進位制流
,軟體接收端需要安裝資料幀格式進行解析後處理。由於嵌入式組的FPGA傳送程式還處於除錯階段,軟體接收端需要先自己寫個TCP Server
模擬資料傳送。專案開發語言是Python
。
以下是資料幀格式的簡單定義:
對此資料幀格式的定義其實我個人還是有些看法的!首先是一般資料幀都有header
;然後是單通道資料只佔用10bit,但是為了對齊32位補了12個零,有點浪費了。不過這個格式是嵌入式組定義的,也不好說什麼啦 ?
那麼第一個問題就是在Python
中如何將20個bit的兩個通道資料和12個bit的補領拼接在一起,形成一個32位
的基本資料單元?搜了一下Python的文件,發現Python對二進位制串處理相當不友好,根本不能進行類似字串拼接這類的操作。一籌莫展之下請教了一下大牛,發現自己對於二進位制位操作是真的一竅不通!計算機組成原理算是白學了:( 下面進入正題,如何從十進位制整數進行位移操作轉換為上面截圖所示的資料幀格式。
由FPGA傳輸過來的電壓資料是一個無符號整型(實際電壓資料是浮點數,而且有正負,後續還有一個轉換的演算法,這裡不繼續透露了),那麼假設我們有個通道的電壓資料為十進位制整數16
,該整數轉換為32位的二進位制數
應該是00000000 00000000 00000000 00010000
,至於十進位制和二進位制是如何轉換的,如果不會,可以開啟文末的參考網站,上面有提供線上轉換。我們幀格式定義裡面一個通道的資料位是10位,那麼該通道的電壓資料轉為10位二進位制數
應該是0000010000
。如何將這10位二進位制數和最後我們需要的32位二進位制數拼接起來呢?很簡單,我們只需要進行一次移位操作就可以得到了:將16
左移22
位即可!移位後的二進位制串為00000100 00000000 00000000 00000000
,其對應的十進位制數值為67108864
。接下來我們隨機產生第二個通道的資料,假設為十進位制整數12
,其對應的32位二進位制數為00000000 00000000 00000000 00001100
,問題是如何將12和16在保證順序和值正確的情況下拼接起來呢?對於我們的目標資料,是一個32位的二進位制串,我們的第一個通道資料已經佔據了該二進位制串的前十位,那麼第二個通道的資料應該是從第11位開始。所以第二個通道的資料我們左移位數不是22,而是12。將第二個通道的10bit資料左移12位後得到00000000 00000000 11000000 00000000
,其對應的十進位制數為49152
。移位後的數值和原始數字完全不一樣了怎麼辦?不要慌,這裡我們暫時不要關心移位後的數值大小。接下來是關鍵
的一步:將兩個通道的資料拼接起來。怎麼拼接?直接相加或者做或運算
即可!第一個通道移位後的數值67108864
加上第二個通道移位後的數值49152
後得到67158016
,將67158016
轉換為32位二進位制串為0000010000 0000001100 000000000000
。仔細看,這個32位二進位制串的前十位即為第一個通道的資料0000010000
,接下來十位的資料即為第二個通道的資料0000001100
,最後十二位即為補的零。是不是很神奇 ?
接下來將該二進位制串使用socket傳送,然後接收端再進行右移位反序操作即可解出通道的資料,這裡不再繼續下去了。
以下是移位操作的簡單過程
c1 = 16
b_c1 = c1 << 22
c2 = 12
b_c2 = c2 << 12
print(b_c1)
print(b_c2)
print(b_c1 + b_c2)
print(bin(b_c1 + b_c2))
以下是二進位制和整數的相互轉換:
# 整數轉二進位制:
# 1. 採用%2的方式計算
# 2. 採用python自帶了方法 bin.
# 比如bin(10) 回返回字串'0b1010' ,只留下'0','1'序列需要把'0b'去掉.
# bin(number).replace('0b','') 或bin(number)[2:]
>>> bin(10) # 為了下邊表示方便 放入t中
'0b1010'
# 二進位制轉整數:
>>> int(t[2:],2)
10
References:
- 線上進位制轉換:http://www.binaryconvert.com/index.html
python
二進位制和整數相互轉換:https://blog.csdn.net/a1628864705/article/details/52884441
相關文章
- 整數轉化成八進位制、十六進位制、二進位制,以及轉回
- 二進位制漏洞挖掘之整數溢位
- 某演算法競賽題——把一個二進位制的串轉換為十進位制整數演算法
- 求一個整數的二進位制中1的個數
- python進位制轉換(二進位制、十進位制和十六進位制)及注意事項Python
- 遞迴函式實現十進位制正整數轉換為二進位制,八進位制,十六進位制遞迴函式
- [譯]ES6新特性:八進位制和二進位制整數字面量
- 二進位制中1的個數
- 02_Python學習筆記之統計整數二進位制中1的個數Python筆記
- JS的二進位制操作JS
- Java二進位制操作指南Java
- Python 進位制互相轉換(二進位制、十進位制和十六進位制)Python
- 進位制與二進位制及相關轉換
- JS操作二進位制方法 - blobJS
- C++輸入十進位制數,輸出對應二進位制數、十六進位制數C++
- 1290. 二進位制連結串列轉整數
- 輸出二進位制數
- Qt解析十六進位制串QT
- 位運算(一):二進位制中1的個數
- 一看就懂二進位制、八進位制、十六進位制數轉換十進位制
- JavaScript 二進位制數字轉換為十進位制JavaScript
- 實現整數二進位制指定位置為0或1
- Oracle中的二進位制、八進位制、十進位制、十六進位制相互轉換函式Oracle函式
- Java基礎系列-二進位制操作Java
- 檔案操作(二進位制拷貝)
- 二進位制與二進位制運算
- 位運算--求一個 數二進位制中1的個數
- 進位制詳解:二進位制、八進位制和十六進位制
- javascript十進位制數字和二進位制相互轉換JavaScript
- ORACLE使用函式對二進位制、十進位制、十六進位制數互相轉換Oracle函式
- JavaScript 二進位制、八進位制與十六進位制JavaScript
- 【劍指offer】二進位制中1的個數
- 知多一點二進位制中的負數
- 【轉帖】Oracle中的二進位制、八進位制、十進位制、十六進位制相互轉換函式Oracle函式
- 負數的二進位制數問題
- Python 十進位制轉換為二進位制 高位補零Python
- (二進位制)
- 二進位制