#define BITPERWORD 32
#define SHIFT 5
#define MASK 0x1F
#define N 10000000
int a[1 + N/BITPERWORD];
void set(int i) { a[i>>SHIFT] |= (1<<(i & MASK)); }
void clr(int i) { a[i>>SHIFT] &= ~(1<<(i & MASK)); }
void test(int i) { return a[i>>SHIFT] & (1<<(i & MASK)); }
보셨던 분은 대강의 내용을 아실거라 믿고 답변 부탁 드릴께요 ㅠ.ㅠ
q1) a[i>>SHIFT] <== a배열의 인덱스 부분을 SHIFT 하는 이유가 무엇 인가요? 왜 건드는지 모르겠음...
(인덱스라고 생각하는 고정관념의 문제인가...)
q2) 1을 << 하는데 [ (i & MASK) 부분이 {상수} & {00011111} 이니까 결과가 000xxxxx 형태로 나올텐데..
이것을 또왜 |= <--- 이걸 하는지..... (많이 어려움 ㅠ.ㅠ) 그런데 << 연산은 뒤에 쓰인 정수만큼
움직이지 않음?????
아 궁금해요 ㅠ.ㅠ
int잖여. int가 4byte라고 치면 32bit -> >> 5 를 하면 32로 나눈거랑 같음
그니까 앞쪽은 32로 나눈 몫을 따고 아래쪽은 나머지를 딴다고 생각하면 돼
a[i>>SHIFT] 로 a 배열의 어느 index 에 적히는지 계산하고, 뒤의 마스크에서 어느 bit에 적힐건지 계산하는거야
set함수는 a[i / 32] = a[i / 32] | 1 << (i % 32)); 와같음 이라구하면 이해에도움이좀 되려나
실제로 index 몇 개 넣고 손으로 계산하면 이해가 갈꺼야. 이런건 직접 해보는게 이해가 빠름.
오... 헐트(!!) 형 ㄳ