2016-07-28 40 views
0

所以我有一個靜態散列表,並且在表中添加代碼之前,索引正在與0異或。爲什麼如果表的索引已經被聲明爲整數?與0異或的目的是什麼?

h = 0; 
h ^= (i << LZW_HASH_SHIFT); 
if (h >= LZW_HASH_SIZE) 
{ 
    h -= LZW_HASH_SIZE; 
} 
s->tab[h].code = i; 
s->tab[h].suffix = i; 
s->tab[h].hash_prefix = LZW_PREFIX_EMPTY; 

此源代碼是FFmpeg LZW編碼器庫的一部分。

+0

我找不到這個代碼,我希望看到它周圍的環境。我能看到的最接近的是[here](https://github.com/uwehermann/easybox-904-lte-firmware/blob/master/package/ffmpeg/src/libavcodec/lzwenc.c#L173),但它不會不符合你的代碼。 – Amadan

+0

沒錯,就是這樣。我只是將源代碼從'hash'函數複製到'clearTable()',因爲編譯器沒有正確內聯。 –

+0

基本上,'hash'函數執行XOR操作,但是當您清除表並使用默認值填充時,零將作爲'head'參數傳遞給'hash'函數。 –

回答

1

在原始代碼中,hash函數是從代碼中的其他地方調用的,並且在該行不執行任何操作時複製函數僅用於避免特殊情況下的一行是沒有意義的。因此,當從clearTable(浪費可忽略的時間量)調用它時什麼都不做,但在用非零的參數調用時會做一些明智的事情。

在你的情況下,唯一的目的是展示的複製粘貼怎麼瞎壞了,我想:)

+0

是的,我剛剛意識到,我的壞。唯一的原因是我將'hash'代碼複製粘貼到'clearTable'中是因爲'inline'不能正常工作,因爲使用'inline'所需的時間比複製粘貼基本內聯代碼的時間要大得多。 –

+0

另外,如果你熟悉FFmpeg,你可以向我解釋'put_bits' lib的唯一目的是什麼? –

+0

一般來說,如果你有一個無關的查詢,你應該問一個新的StackOverflow問題。無論如何,'put_bits'允許你將位打包成一個整數數組。想象一下,你正在將沙丁魚裝進適合8個沙丁魚的罐頭裏。如果你得到13沙丁魚,你會填滿一個整個罐頭,並在第二個放一些沙丁魚,在第二個盒子留下3個沙丁魚的空間。如果再加一個沙丁魚,你可以把它放在第二個罐子旁邊。再獲得6個,你將剩下兩個滿罐和半滿三分之一。 'put_bits'確實是一樣的,但每個都可以是一個32位的整數,並且每條魚都是0或1. – Amadan

相關問題