반응형
참고
- 타입 캐스팅으로 deep copy, memcpy 구현하기
타입 캐스팅을 이용하면 char 배열 8칸을 한꺼번에 입력할 수 있다.
즉, 크기가 작은 타입의 배열을 long type으로 한 번에 읽거나 쓸 수 있다.
이 방법은 메모리를 통째로 복사하는 방법과 원리가 같다.
Write
char a[8]; 배열에 1, 2, 3, 4, 5, 6, 7, 8을 입력해야 한다고 하자.
그러면 for문을 8번 순회해서 i 번째 배열에 i + 1을 입력하는 코드를 만들 수 있다.
char a[8] = { 0 };
for (int i = 0; i < 8; i++) a[i] = i + 1;
하지만 type casting으로 a[0]번째 주소 (&a[0])을 long type으로 캐스팅하면, 한 번에 값을 입력할 수 있다.
typedef long long int ll;
*(ll*)&a[0] = 0x0102030405060708;
위 방법은 실제로 0x[01][02]...[08] 순서대로 들어가지 않고, [08]이 먼저 a[0]에 들어간다.
따라서 아래와 같이 코드를 수정해야 a[i] = i + 1 과 같은 결과가 된다.
// *(ll*)&a[0] = 0x0102030405060708; // 거꾸로 들어감.
*(ll*)&a[0] = 0x0807060504030201;
전체 코드는 다음과 같다.
#include <stdio.h>
typedef long long int ll;
int main()
{
char a[8] = { 0 };
//for (int i = 0; i < 8; i++) a[i] = i + 1;
// *(ll*)&a[0] = 0x0102030405060708; // 거꾸로 들어감.
*(ll*)&a[0] = 0x0807060504030201;
for (int i = 0; i < 8; i++) printf("%d ", a[i]);
putchar('\n');
return 0;
}
Read
위의 방법을 응용하여 한 번에 값을 비교하는 것도 가능하다.
char a[8]; 이 모두 같은 value인지 체크하는 함수는 다음과 같다.
bool checkAll(char* a, int value)
{
for (int i = 0; i < 8; i++)
if (a[i] != value) return false;
return true;
}
아래의 함수를 실행하면 checkAll이 true가 된다.
#include <stdio.h>
bool checkAll(char* a, int value)
{
for (int i = 0; i < 8; i++)
if (a[i] != value) return false;
return true;
}
int main()
{
char a[8] = { 0 };
for (int i = 0; i < 8; i++) a[i] = 1;
int value = 1;
if (checkAll(a, value)) printf("all a[i] is %d\n", value);
else printf("a[i] is not value %d\n", value);
return 0;
}
checkAll은 8개의 배열을 매번 비교하지만, 타입 캐스팅을 이용하면 한 번에 비교가 가능하다.
char 배열이 연속으로 1이 8개라는 것은 long type으로 메모리를 읽었을 때, 0x0101010101010101 이기 때문이다.
if ( *(ll*)&a[0] == 0x0101010101010101 ) ...
따라서 아래와 같이 코드를 간결히 수정할 수 있다.
#include <stdio.h>
typedef long long int ll;
int main()
{
char a[8] = { 0 };
for (int i = 0; i < 8; i++) a[i] = 1;
// *(ll*)&a[0] = 0x0101010101010101;
if (*(ll*)&a[0] == 0x0101010101010101) printf("all a[i] is %d\n", 1);
else printf("a[i] is not value %d\n", 1);
return 0;
}
반응형
'알고리즘 > [EXP] 삼성 SW 역량 테스트 C형' 카테고리의 다른 글
세그먼트 트리를 이용한 링크드 리스트의 삽입과 삭제 (1) | 2023.08.25 |
---|---|
2차원 배열 탐색과 캐시 미스 (Cache Misses in 2D Arrays) (0) | 2023.08.15 |
타입 캐스팅으로 deep copy, memcpy 구현하기 (Memory Copy with Type Casting) (0) | 2023.08.15 |
간단한 윤곽선 검출로 정사각형 찾기 (Find Squares with Simple Edge Detection) (0) | 2023.08.14 |
메모리 주소를 기록하여 배열에 접근하기 (0) | 2023.07.30 |
댓글