2010-10-24 29 views
0

我有16個比特值的流,並且我需要調整每個樣品的4個最低顯著比特流。每個短數據的新值是不同的,但是重複每個X短線 - 基本上用每個短線標識一個ID。最有效的方法來修改數據

是否有任何位操作技巧來做到這一點不僅僅是一個for循環快?

更多詳細信息 我正在將文件從一種格式轉換爲另一種格式。目前使用FILE *實現,但如果有幫助,我可以使用Windows特定的API。

[while data remaining] 
{ 
    read X shorts from input 
    tag 4 LSB's 
    write modified data to output 
} 

除了批量操作,我想我一直在尋找的最佳方式的意見來踐踏那些最後4位。

  1. 右移4,左移4 |在新值
  2. &在我的零位,則|在1位
  3. 模數16,增加新的價值

我們只支持WIN7(32或64)現在,這樣的硬件是什麼人選擇了點。

+0

「流」,你的意思是'std :: istream',對不對? – 2010-10-24 21:21:00

+0

你能提供一些細節嗎? – ruslik 2010-10-24 21:25:34

+0

希望能回答你的問題,比利和魯斯利克。 – Thomas 2010-10-25 02:08:38

回答

0

最好的辦法是你的選項2:

int i; 
i &= 0xFFF0; 
i |= tag; 

這樣做對,如果你事先知道標記值長會更快。 您可以在一個長的memcpy的4條短褲,然後在同一時間做同樣的操作與上述4個短褲:

long l; 
l &= 0xFFF0FFF0FFF0FFF0; 
l |= tags; 

其中tags = (long) tag1 << 48 + (long) tag2 << 32 + (long) tag3 << 16 + (long) tag4; 這具有意義,如果你經常重複使用這個值的標籤,而不是如果你有每套4條短褲的構造方式不同。

+0

這是我開始感覺最舒服的,感謝長期的建議。而且我的標籤可以重複使用,所以預製可以很好地工作。標記爲答案,直到/除非有人提出反駁。謝謝! – Thomas 2010-10-25 20:30:18

3

如果你如工作一個32位的平臺,你一次可以做2個。或者在現代的x86平臺上,您可以使用SIMD指令一次操作128位。

除此之外,有沒有位變換的方法,以避免通過您的整個數據集,因爲它聽起來像你必須修改每一個元素的循環!踩那些最後4位

+1

試着避免循環中的分支(尤其是那些依賴於讀取數據的分支)。 – ruslik 2010-10-24 21:29:24

+0

儘可能多地將數據文件讀入內存中,或者使用爲您緩衝的數據文件(ifstream可能會這樣做)。 – 2010-10-25 02:47:39

+0

在int *上工作真的比在同一塊數據上使用short *更快嗎? – Thomas 2010-10-25 12:54:11

相關問題