2014-10-17 5 views
0

int 배열을 비트 맵으로 사용하면 할당 할 수있는 크기는 (1 < <28)/32가됩니다. int가 32 비트이기 때문에 ...? 그리고 어떤 함수가 호출되기 전에이 공간을 calloc하고 싶다면 특별한 일을해야합니까? calloc을 사용하여 C에서 비트 맵 생성

저는 calloc을 사용하여 배열 위치에서 비트를 검사하고 설정할 수있는 비트 배열을 사용하려고합니다.

내 시도 :

int bitmap[] = calloc(1<<28, 1); 

int bitmap[] = (int*) calloc(1<<28, 1); 

내가 비트 맵 또는은 calloc에 ​​캐스팅 내용을 입력 무엇인지 확실하지 않다가 ...

는 어떤 도움을 주시면 감사하겠습니다!

+0

왜 정수인가? 비트 맵의 ​​경우'unsigned char' 배열은 쉽고 직관적 인 접근을합니다. – usr2564301

답변

2

C의 "비트 배열"로 직접 작업 할 수 없습니다. 더 큰 단위로 개별 비트에 액세스하려면 마스킹/비트 쉬프트 연산자를 사용해야합니다 (적어도 8 비트 char).

또한, 당신이 시도하는지에 대한 올바른 구문은 다음과 같습니다 (1 < < 28) int의 배열을 할당합니다

int *bitmap = calloc(1<<28, sizeof(int)); 

. 이 같은

액세스를 : 모든

int i; 
for (i = 0; i < (1<<28); ++i) { 
    bitmap[i] = ... 
} 
+0

여기서'SOME_UPPER_BOUND <= (1 << 28)' –

+0

'int * bitmap = calloc (1 << 28, sizeof (int));'를 사용하면'오류 : 초기화 요소가 일정하지 않다 '라는 메시지가 나타날 수 있습니다. 나는 그것을 일정하게 만든다? – Nick

+0

수 없습니다. 함수에서 그런 식으로해야합니다. –

1

먼저 대신 서명 INT의 unsigned int로 비트 맵의 ​​기본 유형을 정의하는 것이 좋습니다.

포인터를 반환하는 calloc을 사용하기 때문에 정의 된 객체의 유형도 포인터가됩니다.

unsigned int *bitmap = calloc(1u << 28, sizeof(unsigned int)); 

내가 처음 값 1U < < (28) 당신이 정말로 필요한 것을 의심하지만.

+0

내가 필요로하는 것은 내가 아직 값을 보았던 지 저장할 수있는 큰 배열이다. 그래서 모든 것이 0으로 초기화되고 나중에 1로 설정 될 수 있기를 바란다. 그래서 32 비트 인 unsigned int가 주어진다면, 나는 'calloc ((1u << 28)/32, sizeof (unsigned int));'어떻게하면 이것을 인스턴스 변수로 만들 수 있을까요? 어떤 메소드를 실행하기 전에 0으로?! – Nick

+0

@ 닉 모든 비트를 0으로 설정하려면 표준 함수 memset을 사용해야합니다. –