2016-09-10 52 views
1

如何以儘可能高效的方式爲所有半字節創建一個無符號64位整數的掩碼,以匹配某個值?爲特定的半字節創建掩碼

例如,假設我有一個64位無符號整數:

0000 0100 0011 0011 0011 0011 0010 0010 0010 0010 0010 0010 0001 0001 0001 0001 

而且說我只希望允許擁有的0010 值啃我怎樣才能找到那些蠶食和創建蒙爲他們。 在這種人爲的例子我知道當然半字節5:10是0010,等等對應的掩模來創建是:

0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 1111 1111 0000 0000 0000 0000 

但是我想爲任何64位無符號整數,任何形成這種掩模蠶食價值。例如,我可能對010000101000半字節感興趣。

+0

這是一個解謎意義上的有趣問題,但我不知道它是否可能是XY問題? – njuffa

回答

1

例如如下(只是的公知的技巧的組合物)

  1. XOR與期望的值,使得一個半字節0 當且僅當它具有正確的值
  2. 計算水平-OR爲所有啃
  3. 刪除垃圾位
  4. 加寬的結果,以適應整個啃
  5. 面具最終倒,反轉回來

所以沒有測試:

x ^= test_value 
// now h-OR nibbles 
x |= x >> 1 
x |= x >> 2 
// remove junk 
x &= 0x1111111111111111 
// widen 
x *= 15 
// invert 
x = ~x 
+0

真是太神奇了,謝謝!我在回答問題之前10分鐘就想出了一個解決方案,我已經將它包括在內以提供完整性,但它不像您的解決方案那麼簡潔!我接受你的答案。 – Ward9250

0

這裏有一個版本,我設法拿出試驗和錯誤小時後,卻是近norwhere以純如哈羅德的版本。爲了完整性,我在這裏發佈它: 我把它寫在茱莉亞語言中。

@inline function mask_nibbles(x::UInt64, value::UInt64) 
    x = ~(x $ value) 
    x = (x & 0x1111111111111111) & 
    ((x >> 1) & 0x1111111111111111) & 
    ((x >> 2) & 0x1111111111111111) & 
    ((x >> 3) & 0x1111111111111111) 
    return x | (x << 1) | (x << 2) | (x << 3) 
end