분류 전체보기

CS/자료구조

[자료구조 및 프로그래밍] 4. Linked List

지난 글까지 Array 를 이용한 스택과 큐의 구현에 대해 정리하였고, 지난 글에서는 특히 단순하게 구현한 큐에서 메모리를 제대로 활용하지 못하는 문제를 해결하기 위해 Circular Queue 를 구현하는 과정을 소개하였다. 이번 글에서는 Array 와 다른 Linked List 라는 새로운 자료구조를 정리하고자 한다. Linked List Linked List 는 한국어로 번역하면 '연결리스트' 라고 한다. 말 그대로 선으로 연결하여 나타낸 리스트를 의미하는데, 연결 리스트의 특징은 배열과 달리 데이터와 데이터가 메모리의 연속된 공간에 존재하지 않을 수 있다. 대신 연결된 다음 데이터를 나타낼 그 데이터의 주소를 같이 저장함으로서 데이터와 데이터의 연결관계를 나타내는 특징이 있다. 그림과 같이 저장할..

CS/멀티미디어응용수학

[멀티미디어응용수학] 3. 외적과 외적의 응용

지난 글에서는 내적과 내적의 응용 5가지에 대해 정리하였다. 이번 글에서는 외적과 외적의 응용에 대해 정리하고자 한다. 외적 내적때와 마찬가지로, 외적도 정의를 우선 깔고 시작하자. 외적은 a x b 로 표현하며, 이는 크기와 방향이 모두 있는 '벡터' 이다. 외적은 3차원에서만 사용가능하며, 아래와 같이 계산한다. a = (ax, ay, az), b = (bx, by, bz) a x b = (ay*bz - az*by, az*bx - ax*bz, ax*by - ay*bx) 식이 굉장히 복잡하다. 외적은 '방향' 이 존재하는 벡터인데, 외적의 결과 방향은 a와 b에 모두 수직인 방향이다. 이때 수직인 방향이 2개 존재하는데, 오른손을 기준으로 a, b 를 잡을 때 엄지손가락의 방향이 외적의 방향이다. (왼..

CS/어셈블리

[SPARC] 14. 곱셈과 나눗셈 그리고 서브루틴

지난 글에서는 큰 수 덧셈과 뺄셈에 대하여 정리하였다. 간단하게 요약하면 큰 수를 더하고 뺄 때는 cc 명령어를 사용해 캐리를 넘겨주고, x 명령어를 사용해 캐리를 받아 여러 레지스터를 사용해 큰 수를 연산하였다. 이번 글에서는 SPARC 프로세서의 곱셈과 서브루틴에 대해 정리하고자 한다. 곱셈 곱셈은 기본적으로 bitshift 와 덧셈의 조합이다. 예를 들어 101 x 204 를 한다고 해보자. 초등학교 때로 돌아가 어떻게 큰 수의 곱셈을 했는지 따져보면 101 x 4 x 1 101 x 0 x 10 101 x 2 x 100 이렇게 곱셈을 하고 다 더해서 곱셈을 계산했던 기억이 있을 것이다. 컴퓨터도 마찬가지로 이진수에 대해 위와같은 연산을 함으로써 곱셈을 구현한다. 이때 1, 10 100 처럼 1, 2..

CS/멀티미디어응용수학

[멀티미디어응용수학] 2. 내적과 내적의 응용

지난 글에서는 벡터로 표현한 서로 다른 두 직선의 교점을 구하는 방법을 정리하여 보았다. 이번 글에서는 내적의 개념과 내적의 응용 예시들을 정리해보겠다. 내적의 정의 벡터 a = (ax, ay, az), 벡터 b = (bx, by, bz) 라고 할 때, 벡터 a 와 벡터 b 의 내적은 아래와 같다. a · b = ax * bx + ay * by + az * bz 또한 내적의 정의로부터 벡터 a 의 크기와 같은 두 백터를 내적한 값은 같다. 만약 두 백터 a, b의 크기와 두 벡터가 이루는 사이각을 안다면 아래와 같이 구할 수도 있다. a · b = ||a|| * ||b|| * cos(세타) 이 식으로부터 내적은 일종의 '투사' 개념이며, 관점바꾸기에 사용됨을 이해할 수 있다. 벡터 a 를 벡터 b 의 방..

CS/어셈블리

[SPARC] 13. Hardware & 큰 수 연산

지난 글에서는 Unsigned Integer / Signed Integer 연산에 대해 정리하였다. Unsigned 연산에서는 덧셈 뺄셈시 Carry가 중요했다. 만약 덧셈을 했는데 Carry 가 발생했다면 오버플로우가 발생한 것이고, 뺄셈을 했는데 Carry가 발생했다면 빼는 수가 빼지는 수보다 더 큰 것임을 의미했다. (그래서 이것이 subcc 를 비교에 사용하는 이유이다.) Signed 연산에서는 덧셈 뺄셈시 Overflow 가 중요했다. 만약 양수와 양수를 더했는데 음수가 나온 것처럼 N 이 활성화 되었다면 오버플로우가 발생한 것이고, 원래 의도된 계산 값이 양수임을 알 수 있다. 만약 음수와 음수를 더했는데, 양수가 나온 것처럼 N 이 활성화되지 않았다면, 오버플로우가 발생한 것이고, 원래 의도..

CS/멀티미디어응용수학

[멀티미디어응용수학] 1. 직선의 교점 계산

지난 글에서는 벡터와 벡터를 이용한 직선식의 표현에 대해 정리하였다. 이번 글에서는 그렇게 표현한 직선식이 여러개 있을 때, 그 직선들이 서로 만나는 지 판별하고, 만난다면 좌표를 어떻게 구할 수 있는지 그 방법을 정리하고자 한다. 2D 직선의 교점 구하기 우선 간단하게 2D 평면에 존재하는 두 직선의 교점을 구해보자. 2D 평면에서 서로 다른 두 직선은 반드시 서로 평행하거나 교차한다. 우선 두 직선이 서로 평행한 경우를 따져보자 L1: y = 2x + 1 L2: y = 2x + 3 이렇게 두 직선이 있을 때, 두 직선을 parametric 표현으로 바꾸면 아래와 같이 바꿀 수 있다. (과정은 L1만 기록하였다) L1(t): (t, 2t+1) L2(t): (t, 2t+3) 저렇게 표현한 것은 사실 x ..

CS/어셈블리

[SPARC] 12. Unsigned/Signed Integer & Carry / Overflow

지난 글에서는 산술 연산과 그 결과에 따라 발생하는 Condition Code 의 종류에 대해 정리하였다. 산술 연산에 대표적으로 add 와 sub 가 있는데, 명령어에 cc 옵션(?)을 붙인 addcc, subcc 명령어는 연산 후 condition code를 반환한다. Condition Code에는 Z, N, V, C 4가지가 있었으며, Z는 연산 결과가 0인지 판별하고, N 은 연산 결과가 음수인지 판별한다. V는 오버플로우 여부를 판별하고, C는 캐리를 반환한다. 이번 글에서는 4가지 코드 중 V 와 C 에 대해 조금 더 자세하게 정리해보고자 한다. 그리고 이를 위해 먼저 Unsigned Integer 와 Signed Integer 에 대해 정리해보겠다. Unsigned Integer / Sign..

CS/어셈블리

[SPARC] 11. 산술 연산과 Condition Code

지난 글에서는 SPARC 언어에서 사용하는 메모리의 종류 Static, Heap, Stack 에 대하여 알아보았다. 전역 변수의 값은 Static 영역, 지역 변수의 값은 Stack 영역, 동적 할당 시에는 Heap 메모리 영역에 데이터가 저장되었다. 그 중 Stack을 자세하게 알아보았는데, Stack은 높은 메모리주소부터 감소하면서 할당되었다. (어셈블리 기준 직접 할당) 할당 명령어는 save, 반환 명령어는 restore 이었고, save 명령어를 통해 stack 과 32byte register 공간도 같이 할당 받았다. 스택의 할당시에는 스택 포인터를 이용해 할당 위치를 알 수 있었다. 이번 글에서는 산술 연산과 Condition Code에 대해 간단하게 살펴보고자 한다. 산술연산 C언어에서 사..

CS/멀티미디어응용수학

[멀티미디어응용수학] 0. 벡터와 선분 표현

멀응수 전공과목을 아직 다 듣지는 않았지만, 배우다보니 점점 멀응수가 어떤 과목인지 알아가고 있다. 지금까지 공부하면서 이해한 멀응수는 정말 말 그대로 '응용수학' 이었다. 특히 '멀티미디어' 분야에 응용이 되기 좋다는 느낌이다. 멀티미디어 분야라고 한다면 게임 그래픽, 카메라 이미지 처리와 같은 곳에서 쓰이는 느낌이다. 그래서 보통 '빛' 을 다루곤 한다. 빛은 직진하다가 어떤 물체에 닿고, 그 빛이 다시 반사되거나 꺾인다. 우리가 카메라로 물체를 보고, 게임에서 그래픽 처리를 하는 과정도 이 '빛' 을 수학적으로 처리하여 얻게 된다. 한 줄기 빛을 '벡터'로 하여 어떤 물체로 뻗어 나갈 때 그 빛이 물체에 닿는지 아니면 물체에 닿고 반사되었을 때 어디로 반사되는 지 등을 계산할 수 있다. 이를 위해 ..

CS/자료구조

[자료구조 및 프로그래밍] 3. Queue (Circular Queue) - 2

지난 포스팅에서는 배열을 이용한 큐를 구현해보았다. front, back 변수를 모두 0으로 초기화 하였을 때, push: back 변수가 가리키는 인덱스에 데이터 추가, back >= size 이면 오버플로우 pop: front 변수가 가리키는 인덱스의 데이터를 제거, front >= back 이면 언더플로우 와 같이 구현할 수 있었다. 그러나 이렇게 구현하면 push 를 최대 N번, pop은 push 횟수 이하로만 할 수 있다는 문제가 있었다. 이번에는 Size N 이라는 메모리 공간에 중간중간 여유가 생긴다면 그 여유공간까지 활용하여 push 를 더 많이 할 수 있도록 기존의 큐를 개선하여 보겠다. 그림과 같이 사이즈 5인 큐에 모든 값이 다 들어있는 상황을 생각해보자. 현재 front 는 2이고,..

에버듀
'분류 전체보기' 카테고리의 글 목록 (40 Page)