2011년 8월 28일 일요일

A와 B가 8bit 숫자일때 A와 B의 값을 바꾸는 함수

블로그 방문자중 다음과 같은 키워드로 검색한 사람이 있어서 서비스겸 답을 올림...(아마 예전에 북미취업 가이드에서 면접 질문 예제를 올릴 것 때문에 검색 hit가 된듯..)

A와 B가 8bit 숫자일때 A와 B의 값을 바꾸는 함수. 단 새로운 변수를 사용하면 안됨

A = A ^ B  (^는 XOR 임)
B = A ^ B
A = A ^ B

팁: A ^ B는 A | B - A & B 임.. (즉, A나 B, 단 A B 둘다 포함인 것은 제외)
검증: 밴다이어 그램을 그려볼 것

2011년 8월 3일 수요일

Unlimited Detail 렌더링 기법 업데이트

Unlimited Detail 테크의 최근 업데이트 비디오.  예전에 이 테크에 대해 블로그 글을 올린적이 있어서 그냥 이번 것도 올림.. 예전에 비해 특별히 달라진 건 없는 듯... 

현재 20 FPS 정도로 돌아간다는데.. 애니메이션 처리는 어떻게 할건지...?


2011년 6월 20일 월요일

난 assert() 대신 int 3를 쓴다.


물론 C 언어에서 제공하는 assert() 함수가 있다. 하지만 난 이걸 사용하지 않는다. 이 함수가 제공하는 callstack 꼬라지가 맘에 안들어서... -_-  assert()에 실패한 코드라인이 callstack 젤 위에 등장해야 하는데 도무지 그러지가 않으니까.. 물론 callstack을 적당히 조작해서 assert()에 실패한 라인을 젤 위에 나오게 하는 꽁수도 있으나.. 매우 복잡해서 생락.... 대신 난 다음과 같은 ASSERT() 매크로를 만들어 사용한다.

#define ASSERT(expr, ...) if(!(expr)) __asm{ int 3 }

이 매크로가 하는일은 ASSERT에 실패할 때 그냥 코드 실행을 중지(break)하는 것... 이걸 사용하는 예는 다음과 같다.

ASSERT( life == sucks, "인생이 x같지 않다니 말이 되냐!?");

위의 문자열 메시지는 프로그래머가 코드 읽는데 도움이 되라고 있는 것.. 위 ASSERT()가 실패하면 디버거 에서 저 코드라인이 등장하니 그냥 문자열을 읽는 것만으로도 뭐가 문제인지 알수 있다.

이 방법은 하드웨어 인터럽트를 사용하므로.. PC에서만 돈다.. PowerPC 계열의 CPU에서 돌릴려면 다음과 같이 해야한단다.

#define ASSERT(expr, ...) if(!(expr)) asm{trap}

즐 코딩?