2013-04-17 44 views
1

我在可變長度位串上做了一些操作。C:在可變長度位串上的位操作

我定義給出一個函數setBits(char *res, int x, int y)應該由*res變量傳遞該位串的工作,一個xy(只提,我想實現像使用每×8位Bloom過濾器):

void setBits(char *res, int x, int y) 
{ 
    *res |= x << (y * 8) 
} 

例如給出以下XY-載體{0,0} ; {0,1} ; {1,2} ; {2,3},我希望這樣的比特串(或反之亦然取決於是否little-或大端,但現在並不重要):

0000 0010 0000 0001 0000 0000 0000 0000 

所以最低8位應該來自{0,0},來自{0,1}的第二個8位,接下來的8位來自{1,2},最後一個來自{2,3}

不幸的是,我似乎沒有得到原因,setBits總是隻返回最後的結果(在這種情況下,即{2,3}的位串)。我調試了代碼,並意識到*res總是0 - 但爲什麼?我究竟做錯了什麼?難道我選擇char*它不起作用,或者我完全錯過了一些非常愚蠢的東西嗎?

回答

4

假設8位字符,您可以存儲在*res中的最大值是0xff,即(1<<8)-1

考慮當你調用setBitsx=1會發生什麼,y=1

x << (y * 8) == 1 << (1 * 8) 
      == 1 << 8 
      == 0x100 

*res是一個8位的值,所以只能存儲這種計算的低8位。對於任何非零值y,可以存儲在*res中的位保證爲0.

+0

哦!所以它真的是'char *'?那我能做些什麼?位串的長度應該是可變的。相反,傳遞'char []'? – navige

+0

是啊,你爲什麼不嘗試'char []'這是一個字節數組,並參見 – noMAD

+0

@navititious對不起,我會努力提供更具體的建議。我不確定你想要實現什麼,也不知道布盧姆過濾器是什麼 – simonc