비트맵 프로그래밍에 대한 질문입니다.
-
게시물 수정 , 삭제는 로그인 필요
지금 책을 보고 있는데 도저히 이해를 할수가 없어서 이렇게 글을 올립니다.
책의 내용을 그래도 적습니다. 책은 C프로그래밍의 이해(3판)입니다.
16*16픽셀 크기의 흑백화면으로 된 작은 크래픽 장치에서 (4,7)의 비트값을
설정하려고 한다.
비트맵을 배열로 나타내는 데는 문제가 있다.
C에는 배열의 데이터형을 비트로 선언할 수 없다. -->이해 안됨ㅜㅜ
따라서 16*16비트 배열을 2*16바이트 배열로 선언하였다. ->이해안됨
(-_- 2*2 바이트라면 이해가 되는데.. 왜 2 * 16 바이트인지???)
이제 x,y인덱스를 byte_x, byte_y. bit_index, bit로 바꾸는데 필요한 것이 무엇인지 알아보자
byte_y의 인덱스는 y인덱스와 동일하므로 (이해 안됨 ㅜㅜ먼소린지)이것의 변환은 간단하다.
byte_y= y;
(앞에 줄처논 부분이 이해가 안되서 그런지 이 이후론 완전 해맵니다.ㅜㅜ 죄다 이해가 안되기 시작해요..ㅜㅜ)
한 바이트는 8비트로 구성된다 따라서 X방향으로 바이트 인덱스는 비트 인덱스의 8배가
된다. 이 변환은 다음과 같다.
byte_x =x/8;
이제 비트 인덱스가 필요하다. 이 인덱스는 0에서 시작해서 7까지 변하고 다시 0부터 시작된다. 따라서 코드는 다음과 같다.
bit_index = x % 8;
이제 비트 그 자체를 지정해 보자 인덱스 0인 비트는 가장 왼쪽 비트 즉, 1000 0000이나
0x80으로 표시되는 비트다. 인덱스 1인 비트는 0100 0000이나 0x80 >>1로 나타내는 가장 왼쪽 바로 다음 비트다. 따라서 원하는 비트는 다음과 같은 코드로 표현할수 잇다.
(이 단락은 이해됩니다.^^;;)
bit = 0x80 >> bit_index;
전체 알고리즘은 다음과 같다.
byte_y = y;
byte_x = x / 8;
bit_index = x % 8;
bit = 0x80 >> bit_index;
graphics[byte_x][byte_y] |= bit;
이 알고리즘은 하나의 매크로로 압축 될수 있다.
#define SET_BIT(x,y) graphics[(x)/8][y] |= (0x80 >> ((x)%8))
이렇게 책의 내용인데요..ㅜㅜ 너무 이해가 안되요 돌기 일보 직전이에요
하루이틀 보고 올리는거 아니거든요..ㅜㅜ한 일주일은 해멘것 같아요.
가장이해가 안되는것은
16*16비트 배열을 왜 2*16바이트 배열로 선언하는거죠?
2*2바이트도 아니구..ㅜㅜ
그냥 참고로 책에 붙어 있는 예제도 올려봅니다.
[예제11-3] 그래픽 배열의 대각선을 화면에 출력하는 프로그램이다.
#include <stdio.h>
#define X_SIZE 40 // x방향 배열 크기
#define Y_SIZE 40 // y방향 배열 크기
/*한바이트당 8비트이므로 X_SIZE/8을 사용*/
char graphics[X_SIZE / 8][Y_SIZE];
#define SET_BIT(x,y) graphics[(x)/8][y] |= (0x80 >> ((x)%8))
int main()
{
int loc;
void print_graphics(void);
for(loc=0; loc<X_SIZE; ++loc)
{
SET_BIT(loc, loc);
}
print_graphics();
return 0;
}
void print_graphics(void)
{
int x;
int y;
unsigned int bit;
for(y=0; y<Y_SIZE; ++y)
{
for(x=0; x<X_SIZE/8; ++x)
{
for(bit=0x80; bit >0; bit=(bit>>1))
{
if((graphics[x][y]&bit) !=0)
{
printf("X");
}
else
{
printf(".");
}
}
}
printf("\n");
}
}
지금 책을 보고 있는데 도저히 이해를 할수가 없어서 이렇게 글을 올립니다.
책의 내용을 그래도 적습니다. 책은 C프로그래밍의 이해(3판)입니다.
16*16픽셀 크기의 흑백화면으로 된 작은 크래픽 장치에서 (4,7)의 비트값을
설정하려고 한다.
비트맵을 배열로 나타내는 데는 문제가 있다.
C에는 배열의 데이터형을 비트로 선언할 수 없다. -->이해 안됨ㅜㅜ
따라서 16*16비트 배열을 2*16바이트 배열로 선언하였다. ->이해안됨
(-_- 2*2 바이트라면 이해가 되는데.. 왜 2 * 16 바이트인지???)
이제 x,y인덱스를 byte_x, byte_y. bit_index, bit로 바꾸는데 필요한 것이 무엇인지 알아보자
byte_y의 인덱스는 y인덱스와 동일하므로 (이해 안됨 ㅜㅜ먼소린지)이것의 변환은 간단하다.
byte_y= y;
(앞에 줄처논 부분이 이해가 안되서 그런지 이 이후론 완전 해맵니다.ㅜㅜ 죄다 이해가 안되기 시작해요..ㅜㅜ)
한 바이트는 8비트로 구성된다 따라서 X방향으로 바이트 인덱스는 비트 인덱스의 8배가
된다. 이 변환은 다음과 같다.
byte_x =x/8;
이제 비트 인덱스가 필요하다. 이 인덱스는 0에서 시작해서 7까지 변하고 다시 0부터 시작된다. 따라서 코드는 다음과 같다.
bit_index = x % 8;
이제 비트 그 자체를 지정해 보자 인덱스 0인 비트는 가장 왼쪽 비트 즉, 1000 0000이나
0x80으로 표시되는 비트다. 인덱스 1인 비트는 0100 0000이나 0x80 >>1로 나타내는 가장 왼쪽 바로 다음 비트다. 따라서 원하는 비트는 다음과 같은 코드로 표현할수 잇다.
(이 단락은 이해됩니다.^^;;)
bit = 0x80 >> bit_index;
전체 알고리즘은 다음과 같다.
byte_y = y;
byte_x = x / 8;
bit_index = x % 8;
bit = 0x80 >> bit_index;
graphics[byte_x][byte_y] |= bit;
이 알고리즘은 하나의 매크로로 압축 될수 있다.
#define SET_BIT(x,y) graphics[(x)/8][y] |= (0x80 >> ((x)%8))
이렇게 책의 내용인데요..ㅜㅜ 너무 이해가 안되요 돌기 일보 직전이에요
하루이틀 보고 올리는거 아니거든요..ㅜㅜ한 일주일은 해멘것 같아요.
가장이해가 안되는것은
16*16비트 배열을 왜 2*16바이트 배열로 선언하는거죠?
2*2바이트도 아니구..ㅜㅜ
그냥 참고로 책에 붙어 있는 예제도 올려봅니다.
[예제11-3] 그래픽 배열의 대각선을 화면에 출력하는 프로그램이다.
#include <stdio.h>
#define X_SIZE 40 // x방향 배열 크기
#define Y_SIZE 40 // y방향 배열 크기
/*한바이트당 8비트이므로 X_SIZE/8을 사용*/
char graphics[X_SIZE / 8][Y_SIZE];
#define SET_BIT(x,y) graphics[(x)/8][y] |= (0x80 >> ((x)%8))
int main()
{
int loc;
void print_graphics(void);
for(loc=0; loc<X_SIZE; ++loc)
{
SET_BIT(loc, loc);
}
print_graphics();
return 0;
}
void print_graphics(void)
{
int x;
int y;
unsigned int bit;
for(y=0; y<Y_SIZE; ++y)
{
for(x=0; x<X_SIZE/8; ++x)
{
for(bit=0x80; bit >0; bit=(bit>>1))
{
if((graphics[x][y]&bit) !=0)
{
printf("X");
}
else
{
printf(".");
}
}
}
printf("\n");
}
}