簡體   English   中英

位掩碼 - C++ 到 Python

[英]Bit-masking - C++ to Python

我在我的工作中遇到了一個 C++ function 使用位掩碼從 16 位無符號 integer 中提取 integer 數字。

我需要將其移植到 Python,並且不確定這些語言之間是否具有相同的語法,或者這些實現之間是否存在任何特殊差異。

我的 C++ function 是這樣的:

 void BitMapper(unsigned int x){

    unsigned int a=0;
    unsigned int b=0;
    unsigned int c=0;

    unsigned int aMask=0xff00; 
    unsigned int bMask=0x00f0;
    unsigned int cMask=0x000f;

    a=(x & aMask)>>8;
    b=(x & bMask)>>4;
    c=(x & cMask);

    std::cout<< a << "\t" << "b" << "\t"<< c <<std::endl;
 }

我在 Python 中非常天真地實現了它:

def BitMapper(x, aMask=0xff00, bMask=0x00f0, cMask=0x000f):
    
    ###Missing some method to cast x as unsigned 16 bit unsigned integer

    a = (x & aMask)>>8
    b = (x & bMask)>>4
    c = (x & cMask)
    
    print("\t {0} \t {1} \t {2}".format(a, b, c))
    

這個實現是否正確? 如果不是,我做錯了什么,為什么?

我很清楚我以前從未遇到過位掩碼,所以如果有愚蠢的錯誤,那是因為我已經對這里發生的事情感到困惑。

我知道我的輸入格式是:

    a       b      c
00000000 | 0000 | 0000

我假設<<正在做位移,大概是 a 和 b 的長度由 function 定義中的位移值。 至於掩碼的十六進制代碼,我不知道這是什么意思。

如果有人能告訴我這個 function 到底發生了什么,我將不勝感激。

這個實現是否正確?

大概。

無論如何,您應該先對其進行測試。 如果您總是從 C++ 和 Python 實現中得到相同的結果(對於合理的輸入范圍,其中所有內容都適合unsigned int ),那應該會給您一些信心。

我很清楚我以前從未遇到過位掩碼

因此,編寫大量玩具測試,直到您了解正在發生的事情。 什么是1 & 1 什么是1 & 2 你明白為什么嗎?

Python 甚至有一個解釋器,只需在其中編寫一堆按位和表達式並查看結果是否符合您的預期是沒有成本的。

...我假設<<正在做一些轉變

您可以在此處閱讀此操作的 Python 文檔和此處閱讀 C++ 文檔。 所有這些東西都被記錄在案並且可以搜索(一旦你知道它存在可以被搜索,並且大致知道要尋找什么)。

這個網站上還有一個非常詳細的解釋,我只是通過在搜索欄中輸入“bitshift”找到的。

同樣,您可以(並且應該)通過測試您獲得的值來確認您的理解,例如。 1 << 11 << 2 ,也許更相關的是0xff00 >> 8 ,等等。

// 這些最初是沒有類型的

唯一的問題是:C++ 不允許非類型化聲明,因此這些abc可能是真正的全局變量或命名空間 scope 變量。 如果是這種情況,那么原始 function 會產生您無法復制的副作用。 找出聲明a等的位置,並確定它們是否在其他地方使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM