2013-04-17 1 views
1

가변 길이 비트 문자열에서 일부 비트 연산을 수행하고 있습니다.C : 가변 길이 비트 문자열에 대한 비트 연산

내가 주어진 *res 변수에 의해 전달 된 비트 스트링에서 작동해야하는 기능 setBits(char *res, int x, int y)을 정의 xy (그냥 X 당 8 비트를 사용하여 블룸 필터 같은 것을 구현하기 위해 노력하고있어 언급) :

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

예 : (little- 또는 빅 엔디안은,하지만 지금은 중요하지 않다 여부 반대 따라) 다음 XY-벡터 {0,0} ; {0,1} ; {1,2} ; {2,3} 주어, 나는이 같은 비트 문자열 예상 :

0000 0010 0000 0001 0000 0000 0000 0000 

그래서 가장 낮은 (8) 비트는 {0,0}, 두 번째 8 비트는 {0,1}, 다음 8 비트는 {1,2} 및 마지막 비트는 {2,3}입니다.

불행히도 나는 그 이유를 알지 못합니다. setBits은 항상 마지막 결과 (이 경우 즉 {2,3}의 비트 문자열) 만 반환합니다. 코드를 디버깅하여 *res이 항상 0이라는 것을 깨달았습니다.하지만 그 이유는 무엇입니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까? char*이 작동하지 않거나 완전히 어리석은 뭔가를 놓친 것입니까?

답변

4

8 비트 문자를 사용한다고 가정 할 때 *res에 저장할 수있는 최대 값은 , 즉 (1<<8)-1입니다.

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

*resy=1 그렇게 만이 계산의 하단에 8 비트를 저장할 수있는 8 비트 값, 당신은 x=1에 대한 setBits를 호출 할 때 어떻게되는지 생각해 보자. y의 0이 아닌 값의 경우 *res에 저장할 수있는 비트는 0으로 보장됩니다.

+0

오! 정말'char *'입니까? 그럼 내가 뭘 할 수 있니? 비트 문자열의 길이는 가변적이어야한다. 'char []'를 대신 전달 하시겠습니까? – navige

+0

네, 바이트 배열이고' – noMAD

+0

@navititious '를 참조하십시오. char []'을 시도해 보시지 않으시겠습니까? 죄송합니다. 더 구체적인 조언을하기 위해 애 쓰고 있습니다. Bloom 필터가 무엇인지 알지 못하고 무엇을 성취하려고하는지 잘 모르겠다. – simonc