완전 재밌다. ( 장영실 캐스팅 좀 에러인듯, 불만스러워 보여 ;;; 상상했던 이미지는 이게 아닌데 )
오프닝 코믹하다. " 나랏말싸미 듕귁에 달아 ..."
한자로 타자친다고 생각하니 ㅠㅠ.. 한글 쓰게 해주셔서 너무 감사하다. 1분간 묵념....
세종 완전 멋있긴 한데, 영웅은 호색이라 했던가. 김유신은 얼마나 자주 기생집에 드나들었으면, 김유신의 애마가 네비게이션도 없이 김유신을 기생집으로 모셨겠나. 근데, 그런 준마를 쳐죽이는 김유신은 또 뭐야;;; 성격 참 알만하네... 근데 그걸 또 아이들에게 위대한 일화로 전하는 위인전기는, 이부분에서 무슨 교훈을 주려고 한걸까 -_-;;;;
암튼 그중에서도 가장 으뜸은 역시 세종이라 하겠다. 빈궁들부터 무수리까지 두루두루 친히 살피었으니 궁녀들 또한 불만이 없고, 궁은 항상 화평하였다고 한다. 반면 문종은 하도 책만보고 궁녀들 관리를 안해서 동성애로 궁녀 여럿 사약먹었다. 뭐 자식수만 봐도 세종이 최강이다. 25명을 낳았을 정도니... ㅎㄷㄷ 요절한 애들 빼고도 22명이었으니, 후대에 탈이 좀 나는건 당연지사인듯. -_- 일단 너무 많잖아...
그리고, 세종의 말못할 고민중의 하나가 있었는데, 바로 STD인 임질었다. 너나할것없이 가리지 않고 사랑해주었으니 성병에 안걸리는게 더 이상하다하겠다. 세종실록의 온행에 관한 기록은 사실 임질의 증상개선을 위해서 였다고... 그나저나, 세종의 임질로 다른 궁녀들도 임질이 전염되었을 것은 불 보듯 뻔한 일이라는... -_- 이걸 어째 ㅎㅎㅎ
임질하니까 갑자기 리아가 떠오른다. 리아랑 별명얘기를 하다가, 순간 라임이 맞는 단어가 떠올랐는데, 다이어리아 하고 가너리아 였다.. 차마 가너리아는 말 못하겠고 해서 다이어리아~ 이랬더니 리아가 ㅋㅋㅋ 사실 자기 어릴때 별명이 가너 였다고... -_-;;; 참 괜찮은 친구였는데...
수학 교양서들...
Misc.2008. 5. 20. 00:51 |근데, 집에 와서 보니 내 책상에 덩그러니 그대로 놓여있다. 공부도 하기 싫고해서 무심코 집어들었는데, 몇년전에 읽었을때와는 또 느낌이 다르다.
근데, 내용중에 E.T Bell 의 명저 [Men of Mathematics](1937) 에 관한 내용이 있었구나. (국내번역판: 수학을 만든 사람들 상,하) 일전에 싸이에 리뷰를 간단히 올린적이 있는 책인데, 정말 손에서 떨어지지 않는 책이었는데...
페르마의 마지막 정리를 증명한 앤드루 와일즈가 E.T Bell 의 저서 [The Last Problem](1961) 을 읽고 페르마정리의 증명에 대한 꿈을 키웠다고...
갑자기 옛생각이 났다.
수학하고는 아무 상관도 없던 중학교시절, 서점에서 어찌어찌 하다가 책한권을 집어들었는데, 너무 재밌어서 손을 놓치 못하겠는거다. 각 장마다 수학자에 대한 이야기가 나오는데, 제목은 또 얼마나 멋드러지게 지었던지. 아무튼, 벨은 수학뿐만아니라 분명 문학에도 소질이 있었다. 아무튼, 그때가 중3이었는데, 이책에 빠져들면서 수학의 간지에 완전 매료되었었다. 흥미진진한 이 책은 수학의 개념들을 수학에 획을 그은 수학자들을 크로노롸지컬리-o- 등장시키면서 굵직굵직한 개념들을 인류의 위대한 업적이자 가장 매혹적인 발명품으로 소개한다.
역시 옛생각에 책장에서 수학을 만든 사람들을 꺼내서 보니, -_- 나는... 줄을 치면서 읽었구나.
그랬다. 당시 내 수준으로는 도저히 이해할수 없는 내용들인지라, 나는 줄을 치면서 곰곰히 곱씹고, 도대체가 무슨 이야기를 하고 있는지 알고싶어 못견뎌 했던 것이다. 중간중간 여백에 도형을 그려가며 이해해보고자 노력한 흔적이 역력하다.
상,하 권중에 상권만을 가지고 있는데, 그마저도 다 읽지 못했구나. 보니까, 라이프니츠 편까지 읽었었다. 그리고, 라이프니츠 편에서 함수의 곱의 미분공식이 나오는 부분에 여백에 간단한 직관적 증명이 적혀있다.
그렇다. 이부분에서 이해가 안되어서, 다른책을 보게 되었는데, 그것이 바로 또다른 명저 S.P. Thompson 의 [Calculus Made Easy ] (1910) 인 것이다. 이 책은 정말로 쉬운것이어서, 중학생인 내가 미적분학을 물리학스럽게 받아들이게 된 계기가 되었다. 다행히도 이책은 다 봤다. 연습문제도 푼 흔적이 상당하다.
아, 그래서 이책을 다 본다음 다시 Bell 의 책으로 돌아와서 라이프니츠 편을 끈냈것이었다. 그리고 다음편이 베르누이일가에 관한 이야기인데, 여기서부터는 책이 깨끗하다.
내가 가지고 있는 수학교양서들을 나열해 보면,
Eric Temple Bell 의 [수학을 만든 사람들] (미래사) (원제: Men of Mathematics, 1937) ,
(베르누이 편부터 마저 봐야겠다. 아 다시볼생각하니 가슴이 떨린다.)
Silvanus P. Thompson 의 [알기쉬운 미적분](전파과학사) (원제: Calculus Made Easy:..., 1910 ) ,
Petr Beckmann 의 [파이의 역사](배영출판사) (원제: History of Pi , 1971)
( 완전 옛날판이라 내껀 검색도 안된다... 다른 출판사꺼는 검색되는데 ㅎㅎㅎ, 아마 1977년인가 약간 다른 버전이 나온거 같은데, 1971년에 출판된 이책의 번역본에는 76년에 풀린 4색문제도 미해결 문제로 나와있다.)
George Polya 의 [어떻게 문제를 풀것인가] (천재교육) (원제: How to Sove It , 1945 )
(역시 대단한 명저이다. 지금도 계속 새롭게 출판되고 있는걸로 알고있다. 그러나 현실의 교실에서는 책속의 상황과 매우 다르게 전개된다는 것이 좀 문제다. ㅋㅋ )
Alfred North Whitehead 의 [수학에세이](청음사) (원제: An Introduction to Mathematics, 1911 )
(수학의 각 영역 혹은 키워드를 통해 수학에 대한 통찰을 보여주는 책이다. 내가 수학수업을 할때 통상 하는 이야기들이 상당히 많이 들어있다. 그러나 유니폼 컨버전스에 대한 언급도 나오는 수준이기 때문에, 무턱대고 만만한 교양서는 아니라고 생각한다. 학부수학에 대한 약간의 지식이 있다면 매우 쉽고 재밌는 책이라고 생각한다. )
요시나가 요시마사 의 [괴델. 불완전성정리.] (원제: 괴데루(-_-). 불완전성정리, 1992)
(이책은 끝가지 읽긴했지만, 매우 이해가 안갔던 책이기도 하다.)
정도 되겠다. 그밖의 잡서들은 상당수 읽고 버렸거나, 소장하고있어도 부끄러워서 곧 버릴책들이라 거론할 가치도 없다.
아무튼, 위에 열거한 책들은 비록 교양서이지만, 참 신기하게도 서로 신기하게 연결된다. 아, 수학의 아름다움은 비단 전공서에만 국한되지 않는구나!!!! 너무 아름다워서 수학을 가볍게 다룬 책들마저도 수학의 가장 큰 아름다움중의 하나인 연관성을 가지고 있다니...
아... 아름답다... 수학은.
2008/05/14 저녁 옥상
Misc.2008. 5. 14. 20:14 |같이 거닐이가 있었으면 좋겠다
배고프면 발길닿는대로 아무 고깃집에 들어가
주모, 여기 고기좀 내오, 술도 한잔 내오고,...
고이는 군침에 절로 입맛을 다시고
낯선 고깃집에, 시장기 반찬삼아,
고기는 씹으니 제맛이로다
찾아가지 않았으니 둘만의 추억이라
배부르면 또 그렇게 거닐면 좋겠구나
어슴푸레 붉다
∑ 1 / ( n ( log n ) ^ p ) 의 수렴성 판단
Math2008. 5. 11. 22:32 |조금더 복잡한 형태의 시리즈에 대한 수렴조건을 구해보자.
(여기서 로그는 자연로그이다. 근데 뭐 아무래도 상관은 없다. 또, n = 1 이면 분모가 0 이 되니, n = 2 부터 더하자.)
즉, 논네거티브 이면서 monotonically decreasing 하는 경우, 수열의 n 대신 , 2^n 으로 모두 대체해서
시리즈의 수렴성을 판단해도 된다는 말이다.
위의 시리즈의 경우, 구해보면 결국, p급수의 수렴조건과 같게 됨을 알 수 있다.
sub시리즈의 조작과 시리즈의 수렴
Math2008. 5. 11. 21:56 |Theorem.
이 정리의 본질은, 어떤 단조감소하는 논네거티브 시퀀스의 시리즈에 대한 컨버전스가 보다 thin 한 서브시퀀스의 시리즈에 의해서 판단될수 있다는 것이다. 이는, 어떤 씨리즈의 수렴성을 판단하는데 매우 강력한 도구가 될 것이다.
p급수의 수렴성도 이 정리로 간단히 증명할 수 있다.
피아노의 숲 14권을 보다가... 앗 이것은... 임동민, 임동혁?
Misc.2008. 5. 10. 03:51 |쇼팽 콩쿨에 한국 대표로 출전한 안창수/안창우 형제
ㄲㄲㄲㄲㄲㄲ 쌍둥이로 만들어 버리다니 ㅎㅎㅎㅎ
피아노의 숲의 두 주인공 이찌노세 카이 하고 슈헤이 아마미야? 이름은 대충...저런식인데, 둘이 쇼팽콩쿨에서 만난다. 근데, 이 쇼팽콩쿨에 한국형제도 출전하고 ...
이 대회에서 임동민, 임동혁이 공동으로 3등상을 탔는데, (2등수상자 비워놓고 3등줬으니, 실제로는 2등인셈)
그냥 그런가부다 했는데, 그 바로 밑에 일본출전자 두명이 나란히 4등상을 공동수상한게 아닌가.
Shohei Sekimoto , Takashi Yamamoto .
헉! 슈헤이는 이름도 똑같네 -_-! 그럼 "다카시"가 "카이" 인건가?
혹시 15권에서 카이하고 슈헤이, 임동혁한테 캐발리는건가? ㅎㅎㅎㅎ 그렇게 끈나는거 아냐 -_-? ㅋㅋㅋㅋ
워낙 일본애들이 장인이나 고수들에 대한 열망이 강하고, 치켜세우기도 잘해서 (실제로 귀화하라고 조낸 꼬시니까) 조큼 호들갑 스럽다는 느낌이 들때도 있다. 그러면서도 그런 문화가 부럽다.
미스터 초밥왕만 봐도, 조낸 오도방정 떨고, 수백명이 동시에 감탄을 하는 경이로운 사태가 벌어지는데...그거.. 초밥먹는거다. 초밥하나 처먹으면서 말은 정말 오지게 많다.
슬램덩크는 그게 고교생 농구인거시다. -_-;;; 한국한테도 발리는 일본농구ㅋㅋㅋ , 일본만화에서는 이미 고교생이 마이클조던도 울고갈 정도의 초절정 천재농구를 펼친다. 왠 천재는 그렇게 많이 등장하는건지.. 그것도, 우리로 치면 읍면동수준의 대회부터 난리가 난다. 대회가 커질수록 말도안되는 천재캐릭터가 더 요구된다. ㅋㅋㅋ
하지만, 만화에서도 일본농구가 좁밥임을 끝까지 인정하지 않을수는 없기에, 결국 NBA 에 대한 어쩔수없는 동경도 양심상(?) 표현한다. 가령, 서태웅이 NBA 갈까말까 안선생님하고 상담하는것도 그렇고. ㅋㅋㅋㅋ 일본고교생 농구를 그정도로 그렸으니 NBA 는 도대체 어떤무대로 묘사해야 하는 것이냐 ㅎㅎㅎ 아예 하늘에서 용들이 내려와서 농구하지 ㅎㅎㅎ
고스트바둑왕도 마찬가지다. 이건 뭐 일본바둑의 전설적인 고수니, 뭐 일본바둑을 제패한 바둑의 왕이니 하는 애들이 다 등장하는데, 그래봤자 허구헌날 한국바둑에 발리는거다. 그러니 만화가도 어쩔수없이 한국을 울며겨자먹기 식으로 등장시킨다. 바둑전설에, 바둑천재의 스토리를 쓰고싶은데, 항상 한국이 마음에 걸리는거다.
그러고 보면, 울나라가 대단하긴 대단한거 같다. 인구 5천만에서 나온 인재들이 일본은 말할것도 없고, 중국 10억인구를 다 발라버리고, 우승하는 경기들 보면...
메트릭 스페이스에서는 수렴하는 수열은 코시이다.
Math2008. 5. 7. 23:39 |" 메트릭 스페이스의 모든 수렴하는 수열은 코시수열이다. "
에버노트를 써봤다. 에버노트 좋군화~~~ 사용이 굉장이 편하다. 마치 종이에 필기하는 것 같은 필기감...
코시 - 리만 ( Cauchy - Riemann ) Equations
Math2008. 5. 7. 18:58 |따라서, 적어도, zo 에 이르는 수평방향의 편미분이나, 수직방향의 편미분은 같아야 할것이다.
그러므로, f를 z = x + i y 로 미분한다고 할때, y=0 로 놓으면 수평한 경로가 되고, 그때는 dz = dx 가 된다. 또, x=0 로 놓으면 수직한 경로가 되고, dz = i dy 가 된다. 즉, 다음이 성립해야 한다.
f(z) = u(x,y) + i v(x,y ) 라고 성분함수로 놓고서, 코시리만 이퀘이션을 적용해보자. 그리고, 실수파트와 허수파트를 비교하면 다음과 같이된다.
또한, 각 컴퍼넌트 펑션 U(x,y) , V(x,y) 의 x, y 는 z = x + i y 이므로, x 와 y 를 z 와 z bar (complex conjugate 를 bar 로 쓰기로 하자 ) 로 표현할수 있고, 다시말해, x 와 y 가 z 와 z bar 의 함수로 볼수 있고, 각 변수로 편미분을 해보면, 다음과 같은 관계를 얻을수있다.
f(z)를 z로 편미분하는건 결국 그냥 z로 미분하는것이 되고, 그렇게 구한것은 Cauchy-Riemann 하고 그냥 같아진다.
또한, 컴플렉스 컨주게이트로 편미분하고 Cauchy-Riemann 사용하면, 결과가 항상 0이 되는데, 이것을 코시-리만 이퀘이션의 컴플렉스 폼이라고 한다. ( 어차피 동치임 )
복소평면
Math/Complex2008. 5. 7. 02:33 |컴플렉스 플레인과 유클리디언 플레인의 차이를 통해 컴플렉스 플레인이 뭔지를 살펴보자.
메트릭 스페이스로만 보자면 컴플렉스 플레인이나 유클리디언 R² 플레인이나 똑같다. metric인 norm 도 같은걸 쓴다.
algebraic structure 로서 살펴보면, 우선 addition 도 같은 걸 쓴다. 즉, (a,b) + (c,d) = (a+c,b+d)
그러니까 이상태에서 VS over R 을 구성하면 R² 나 C 나 완전하게 똑같은 VS 이다.
결국, 차이는 복소수 곱셈뿐이다. 그러니까 R² 에 (a,b) (c,d) = ( ac - bd , ad + bc ) 라는 곱셈을 추가한 algebraic structure 가 복소평면이라고 할수있다.
복소수의 곱셈을 위처럼 먼저 정의하고, 허수단위 i 를 ( 0, 1 ) 에 대한 special name 정도로 불러줘도 좋고, 반대로 i 를 특수하게 먼저정의하고, 리니어리티 따위로 곱셈을 정의해도 된다.
요컨대, C 는 R² 에 곱셈연산이 하나 추가된 , 즉, R² 의 스페셜케이스이므로, R² 상에서 성립하는 제너럴한 정리들은 그대로 쓸 수 있다.
즉, 2차원 회전행렬이라던가 , 면적분에 대한 그린정리 라던가 하는걸 다 써도 된다는 소리다.
xp-pen 8060b 구입.
Misc.2008. 5. 6. 02:29 |잉, 결국, 루딘은 한글자도 못봤네 ㅠㅠ
5일동안 한게 고작 복소숙제, 달랑 하나야. 허이구.
타블렛pc 알아본다고 인터넷 뒤진게 하루, 급한대로 목표를 낮춰서 타블렛 입력도구 알아본다고 또 하루 , 결국 고심끝에 주문했다!!! 가격대비 괜찮다는 xp-pen 8060b (근데 문제가 좀 많다고들 하네 ㅠㅠㅋㅋ)
9만원 조금 넘게 주고 주문했는데, 쓸만할려나...
와콤 인튜어스3 가 좋다고들 하는데 대략 30만원정도 한다. 뭐 그림그릴껏도 아니고 , 아무리 임펄시브 펄처스를 한다고 해도 소비의 목적과 너무 동떨어진 가격이라 그냥 만만한걸로 주문했다.ㅋㅋㅋㅋ
아, 언제오낭 ~ 두근두근~~ 캬캬캬
오면 또 프로그램 깔고, 적응하고, 사용하고 하는데 또 한참을 보내겠군...ㅎㅎㅎ
후기 ) 레이턴시 높아서 비추임.
공부는 모래알로 태산을 쌓는것과도 같다.
Misc.2008. 5. 5. 16:36 |느린 두뇌회전을 가지고 있는 사람의 하루 공부량은 보잘것 없이 적다.
그래도 measure zero 만 아니면 되는거다.
하루에 모래알 하나씩 모아서, 태산을 쌓는것과 같은거다. 하루하루는 보잘것 없지만, 모이면 언젠가 힘이 되겠지...
그...근데, 너무 늦다 ㅠㅠ. 뭐 중간에 딴짓을 너무 많이 하는 것도 사실이지만... 목요일부터 내내 오늘까지 시간이 있었는데, 복소숙제 하나를 못했다. 미쳐버리겠네... 해석숙제도 나왔는데... 대수도 링 봐야되는데.... 헐...
[복소함수] 지수함수는 주기함수이다.
Math2008. 5. 5. 00:35 |지수함수(exponential funcion)는 주기가 허수( 2 π i )인 주기함수(periodic funtion)이다.
for any complex number z ,
exp[ z + 2 π i ] = exp [ z ]
therefore, exp[ z ] is periodic , with the period 2 π i
이번학기에 다변수함수론 Calculus on Manifold ...
암튼, 저 책... 좀 벅차긴 했다. 내겐 너무 부족한 설명 OTL.... 나같은 풋내기에겐...ㅠㅠ
암튼, 그래서 저책의 저자인 spivak 이라는 이름은 내 뇌리에 강하게 각인되었다.
두고보자. 다음번에 내공쌓아서 제대로 독파해주마... 이러고...
그런데, 일전에 서점에서 본적이 있는 캘큘러스 책중에 하나가 있는데... 저자가 spivak 이라는 사실을 알게 되었다. 헐... 그랬구나. 이책 저자가, 저책 저자였구나... 마치 광학의 헥트가 calculus 의 헥트인것 처럼....
결국, 이사람이 그사람이고 , 그사람이 이사람이고, ...
그코시가 이코시이고 그가우스가 이가우스고, ...가우스 이새끼는 안나오는데가 없다. -_-;;; 가우스님 죄송.
아, 능력자들...
order 6, 8 인 nonabelian group
Math2008. 5. 2. 00:57 |Order 가 2 , 3 , 5 인건 오더가 프라임넘버이므로 Z2, Z3, Z5 로 Up to isomorphism 이다.
즉, 모두 아벨군.
Order 가 4인 경우, Z4 와 클라인4 V 밖에 없다. V는 Z2 x Z2 와 같으므로, 아벨군이다.
결국, 오더 5 이하는 무조건 아벨군이다.
Order 가 6 인 Nonabelian Group 은 S3 뿐이다.
즉, S3 는 크기가 가장작은 비아벨군이다.
Order 7 은 역시 프라임넘버이므로, Z7 과 같고, 따라서 아벨군이다.
Order 가 8 인 Nonabelian Group 은 D4 와 쿼터니안 뿐이다.
[C언어] 부동소수점 데이터 타입 ( float, double ) 의 비트 단위 접근 - 첨부파일 : realdata_bit.exe
COM2008. 4. 30. 13:31 |비트단위 연산 & , | , ^ , << , >> 따위는 피연산자가 정수형으로 제한되어있다.
따라서, 단순히 마스크 만들고 & 연산해서 특정위치의 비트를 알아내는 방법은 먹히지 않는다.
문제는 실수형 타입에 비트연산자들이 접근할수 없다는 것이므로, 이것만 해결하면 된다.
간단한 방법은, union(공용체) 를 사용하는 것이다.
공용체에 실수형 멤버와 정수형 멤버를 같이 선언해서, 같은 메모리를 실수형으로도, 정수형으로도 사용할 수 있게 만들면 된다. 그래서, 배정은 실수 멤버에 하고, 비트연산은 정수형 멤버로 하면 간단히 해결된다.
이와같은 방법을 사용하면, 실수데이타의 비트 시퀀스를 볼수있고, 비트처리를 할수도있다.
---------------------------------------------------------------------------------------------------
다음의 첨부파일은 실수형 데이터의 비트단위 출력 프로그램이다. 코드는 위에서 말한것처럼 공용체와 비트필드를 사용하여 작성되었다.
다음은 실행화면이다.
프로그램은 입력된 실수 데이터를 float 형과 double 형으로 비트 시퀀스를 찍는다.
처음엔, 바이트 단위로 묶어서 출력하고,
두번째는, 의미론적 자료구조를 반영해서 찍는다.
실수 데이터의 부동소수점 표현에 관한 표준규약은 IEEE 754 에 포함되어있다.
간단히 언급만 하자면, 부호필드, 지수필드, 가수(mantissa) 필드 이렇게 순서대로 셋으로 쪼개진다.
단, 0.0 은 그냥 모든 bit 값을 0 으로 하는 것으로 정한다.
부호 필드는 float , bouble 둘다 최상위 1비트 이다.
0: non-negative, 1: negative
지수 필드는 float 의 경우 그 다음의 상위 8 비트이며, double의 경우 11비트 이다.
지수 필드의 경우, 크기 비교 등의 이점을 위해, 지수 바이어스 (Exponent Bias) 를 더해서 저장한다.
참고로, single precision bias 는 2^(8-1) -1 = 127 = 0111 1111 이고, double precision bias 는 2^(11-1) - 1 = 1023 = 011 1111 1111 이다.
지수 필드에, 해당 바이어스를 추가해서 더하면, 지수필드의 첫번째 비트(Exp sign bit) 가 오히려 + 가 1 이 된다.
가수필드는 float 의 경우 23비트, double의 경우 53비트 이다. (double 에서 float 로 캐스팅될땐 자료의 손실이 발생할 수 있다.)
가수, 지수, 밑 따위는 모두 2진수 기준이다.
가수필드 저장시 1 + m1 x 1/2 + m2 x 1/4 + ... 식으로 될때, 1 은 생략하고 m1,m2,m3,... 부분만 저장한다. (이진수 이므로, m1, m2, ... 모두 0 또는 1 로, 해당 2^-k 자리 값이 있으면 1 없으면 0 이다.)
가령, float 의 23bit mantissa 필드의 경우, 1.8125 = 1 + 1/2 + 1/4 + 0 + 1/16 => 110 1000 0000 0000 0000 0000 와 같이 된다.
요약하면, [SignBit, E Field, Mantisa Field] 와 같은 구조로 저장된다고 할 때,
E Field 는 E0 + Bias 이다. (E0 는 원래 지수), 따라서, 저장된 지수필드에서 원래 지수를 구할때는 E0 = Eb - Bias 를 해주면 된다.
Mantisa Field 는 1.0 + m1 x 2^-1 + m2 x 2^-2 + m3 x 2^-3 ... 에 대해, m1m2m3... 이 된다.
이 글의 포커스는 실수형 데이터에 대한 비트접근이므로...
나중에 자세히 살펴보도록 하겠다.
[C언어] 비트단위 연산자 와 마스크(mask) - 첨부파일: bitshift.exe
COM2008. 4. 29. 00:26 |비트단위 연산자는 정수형 데이타를 비트로 접근한다.
각 비트의 1은 True, 0은 False.
[비트단위 논리연산자]
~ NOT 비트단위 논리부정 : True 는 False 로, False 는 True 로 ...
예. ~ 0101 0010 = 1010 1101
& AND 비트단위 논리곱 : 둘다 True 일때만 True , 그렇지않으면 False
| OR 비트단위 논리합 : 둘다 False 일때만 False, 그렇지않으면 True
^ XOR 비트단위 배타적논리합(eXclusive OR) : 둘이 다르면 True, 같으면 False
예. 0101 0010 & 0100 0111 = 0100 0010
0101 0010 | 0100 0111 = 0101 0111
0101 0010 ^ 0100 0111 = 0001 0101
위의 연산자들을 잘 조합하면, NOR나 NAND 도 쉽게 만들 수 있다.
[비트단위 이동연산자]
<< 왼쪽으로 원하는 bit 수 반큼민다.
밀려서 잘려나가는 부분은 버린다. 밀려서 생기는 공백은 0 으로 채운다.
>> 오른쪽으로 원하는 bit 수 반큼민다.
밀려서 잘려나가는 부분은 버린다. 밀려서 생기는 공백은 0 또는 1로 채우는데, 이것은 시스템 의존적이다.
unsigned 인 경우에는 << 와 마찬가지로 0 으로 채운다.
반면, signed 인 경우에는 일반적으로 부호비트를 복사해넣는다. 부호비트는 최상위비트로 음수일때 1, 양수일때 0 이다.
<< 와 >> 는 변수값 자체를 변화시키지 않는다.
값을 변화시키려면, <<= 나 >>= 따위를 써서 재배정 해주면 된다.
첨부된 프로그램은 << 와 >> 가 어떻게 작용하는지 보여준다.
첫번째 데이타는 오른쪽으로 밀었을때 모두 잘려나간 데이터가 버려져서, 왼쪽으로 돌아왔을때 사라진 모습을 보여준다.
두번재 데이타는 왼쪽으로 밀려갔다가, 하필 최상위비트가 1이 되는 바람에 오른쪽으로 돌아올때 부호비트로 공백이 채워진 모습을 보여준다.
첨부파일 ( 입력정수는 int 형임. 오류처리안되어있음 )
마스크(mask)
마스크는 원하는 비트를 추출하기위한 상수이다. 즉 원래의 바이너리 시퀀스 이외에 어떤 구멍이 뽕뽕 뚤린 비교대조용 시퀀스를 만들어서 그것을 마치 오리지날 위에다가 마스크처럼 씨우는거다. ( 덮어쓴다는 말은 아니다. )
하위로 부터 n번째 비트만 1인 마스크는 1<<(n-1) 로 하면 된다.
마스크를 이용하면 트정 비트의 값도 반대로 바꿀수 있고, 비트단위의 출력도 간단하게 할 수 있다. 위 첨부프로그램도 마스크를 루프안에 넣어서 마스크가 움직이면서 각 비트를 찍는 방법으로 인쇄한것이다.
특히, 마스크를 이용해서 인쇄할때, 삼항연산자를 쓰면 편하다.
예. ( a & ( 1<<(n-1))) ? 1 : 0
( a & ( 1<<(n-1))) ? '1' : '0'
[정오표] 그리피스 양자영학
Misc.2008. 4. 28. 22:40 |문화, 때때로 그것은 아무것도 아니다.
Misc.2008. 4. 28. 22:22 |이 동영상에 나오는 여성은 타 종족의 남성과 교제했다는 이유로 2천명의 남자한테 돌로 맞아 죽었다. 정부는 이 여성이 맞을 짓을 했다고 생각하며, 여성을 죽인 남자들은 누구도 처벌받지 않았다. 심지어 어떤 여성은 단지 휴대폰에 익명의 번호로 문자가 왔다는 이유로 시댁의 가족들에게 총살을 당했다.
때때로 우린 너무 쉽게 문화라는 것을 이유로 내뱉으며, 가치판단을 거부한다. 하지만, 문화가 인간의 존엄성을 훼손한다면 그것은 더이상 문화가 아니다. 문화, 그것은 때때로 아무것도 아니다.
[중학 정수론] 156을 몇 번 더하면 처음으로 2008로 나누어지는가? [ 비번 = 답 ]
2008. 4. 28. 19:11보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.
[C언어] 기억영역 클래스 auto, extern, register, static
COM2008. 4. 27. 14:45 |기본적으로 블록 내에서 선언된 변수들은 블록 내부에서 로컬리 사용된다.
블록은 { } 으로 감싸지고, 각 블록은 블록마다 변수를 선언할 수 있다.
ANSI C (C89) 에서 변수의 선언은 블록의 첫부분에서 이루어져야한다. C99 부터는 중간에 선언해도 된다.
블록은 블록내에 또 잡을수 있으므로 이런 방식을 이용하면 함수 중간에 원하는 위치에서 변수를 선언할 수 있다.
아래 왼쪽 코드는 ANSI C (C89) 에서 에러가 난다. 중간에 변수의 선언이 이루어졌기 때문이다. 반면 오른쪽의 코드는 문제가 없다.
int main(void) int main(void)
{ {
int a=0; int a=0;
a++; a++;
{
int b; int b;
... ...
}
} }
그런데 이때, 변수에 대한 scopre rule 은 블록내부이므로, 중간에 새 블록으로 감싸고 선언한 변수는 그 블록을 닫기 전까지만 유효하다는 것에 유의해야한다.
---------------------------------------------------------------------------------------------------
C의 모든 변수와 함수는 데이터 타입 이외에도, 외에도 기억영역 클래스라는 구분을 갖는다. 이것은 적용영역하고도 관련이 있다.
기억영역 클래스 auto, extern, register, static 에 대해서 알아보자.
이것들은 동시에 각 클래스에 대응되는 키워드들이다.
사용형식은 memory_class type identifier ; 이다.
이때 타입은 생략될 수 있으며, 생략시 데이터타입의 디폴트인 int 로 인식된다.
---------------------------------------------------------------------------------------------------
auto 자동변수
함수 내부에서 선언된 변수는 디폴트 로 기억영역 클래스 auto 를 갖는다.
블록 안으로 들어갈때, 시스템은 auto 변수들을 위해 메모리를 할당하고, 블록내에서 로컬리 사용된 변수들은 블록을 벗어날때 메모리를 반납한다. 이후에 블록에 다시 들어가게 되면, 다시 메모리를 할당하지만 이전의 변수값은 알수가 없다.
블록 내에서 디폴트가 auto 이므로, 블록내에서 int a ; 는 auto int a; 와 같다.
---------------------------------------------------------------------------------------------------
extern 외부변수
함수 외부에서 선언된 변수는 디폴트로 extern 이 되고, 글로벌리 사용된다.
가령, 함수밖에서 int a; 는 extern int a; 와 같다. 할당된 메모리는 프로그램이 종료될 때 반환된다.
함수 내부에서 변수 선언시 데이터 타입앞에 키워드 extern 을 사용하면, 그 변수는 그 함수 밖에 이미 extern 으로 선언되어 있는 변수라는 뜻이다. 즉, 외부에서 이 변수를 찾아서 사용해라 라는 의미 정도 된다.
여기서 함수 외부라고 하는 것은 연관된 다른 파일도 포함된다.
함수 내부에서 선언된 변수들은 로컬리 사용되기 때문에, 함수간에 그 변수값을 전달하려면 리턴값으로 보내던지 해야한다. 반면, extern 변수들은 그것과 상관없이 함수간에 값을 전달할 수 있다.
만약, extern 변수가 외부에 있는 상황에서 같은 식별자를 사용하여 함수 내부에서 auto로 변수가 또 선언된다면, 그 함수내에서는 로컬변수가 우선순위가 높으며, 외부변수는 그 내에서는 숨겨진다.
모든 함수들은 선언시에 이미 블록 밖에 있기 때문에 extern 이다.
가령, int f(int ); 라는 프로토타입은 extern int f(int); 와 같다.
---------------------------------------------------------------------------------------------------
register 레지스터변수
컴파일러에게 register 를 사용하도록 권고한다. 단지 권고일뿐 할당받지 못하면 auto 이다. 다시말해, 디폴트가 extern 인 경우는 register 가 될수없다.
레지스터로 많이 선택되는 변수는 루프변수와 접근이 잦은 함수의 퍼레미터이다.
주의: 레지스터 변수는 포인트할 수 없음.
---------------------------------------------------------------------------------------------------
static 정적변수
static 은 파일내에서, 기본적으로, 변수값을 소멸시키지 않고 고정적 지위를 주어서 글로벌리 사용하는것이 기본 목적이다.
따라서, 스코프는 해당 파일내에서, 선언된 이후이다. 한번 선언해 놓은 static 변수는 다시 선언시에 선언이 먹히지 않는다.
그래서 'static' 이라는 표현을 쓴다. 한번 선언하면, 쭈욱~ 유지된다.
주의할점은, static 파일 전체에 걸쳐, 어떠한 지위를 갖기 때문에, 해당 변수가 선언되기 전이라고 하더라도,
해당 파일내의 다른 함수가 그 변수명을 사용할 수 없게 된다.
블럭의 입장에서, 블럭 내부에서 선언된 static 은 static auto 로, 외부에서 선언된 static 은 static extern 이 된다.
static 은 블럭을 빠져나가도 해당 파일내에서는 그 값을 유지한다. 물론, 블럭 안에서 다시 호출해도 여전히 현재 저장된 값을 쓴다.
static auto static extern
{ static int a;
static int a; ...
... {
} ...
}
함수도 변수와 마찬가지로 데이터 타입을 갖듯이 ( =리턴타입) 함수도 기억영역 클래스를 갖는다고 했다.
특히, 함수는 항상 외부에서 선언되므로, extern 이었고, 따라서, 함수에 static 을 쓰면, 당연히 static external 이된다.
즉, 다른파일에서는 그 함수를 쓸수가 없다.
----------------------------------------------------------------------------------------------
예.
void f(void)
{
static int cnt = 0 ;
++cnt;
if(cnt%2 == 0)
...
else
...
}
이 함수가 선언될때, cnt 라는 static 변수가 선언되므로, cnt 라는 변수는 파일전체에 걸쳐서 고정적인 지위를 갖는다.
단, 스코프는 선언된 이후부터 이다.
이 함수를 호출하게 되면, 첫 호출시 cnt 라는 static 변수가 선언되고, 0 으로 초기화 된다. 그러나 이후에 이 함수가 호출될때
이 선언문은 먹히지 않는다.
함수의 호출마다 ++cnt 가 실행되고, 블럭을 벗어나도 cnt 값이 유지된다.
함수내의 if 문에서 cnt 의 패리티에 따라 기능이 다르게 만들어 놓으면, 이 함수는 호출 횟수의 홀짝에 따라 다른 기능의 함수가 된다.
[C언어] 비트필드 (bit field) - 첨부파일 : bitfield.exe
COM2008. 4. 27. 00:46 |[필드와 레코드]
데이터가 의미를 갖는 최소단위를 필드라고 하고, 여러 필드가 모여서 하나의 대상에 대한 자료가 된것이 레코드이다.
이러한 관점에서 구조체를 바라보자.
예. struct student { int id ; double score; } ;
위와 같이 스투던트를 나타내는 자료형을 보면, id 를 나타내기위한 4바이트의 영역과, 점수를 나타내기위한 8바이트의 영역을 합쳐, 총 12바이트짜리 데이터타입이 되는 것이다.
이때 첫 4바이트는 id 를 나타내는 필드가 되고, 두번째인 8바이트는 점수를 나타내기 위한 필드이다.
그리고, student 는 4바이트, 8바이트의 두개의 필드를 갖는 레코드라고 할 수 있다.
-----------------------------------------------------------------------------
[비트필드의 구문]
C에서는 구조체나 공용체를 통해서 사용자 정의형을 만들때, 비트 단위로 필드 폭을 셋팅할 수 있는데, 이렇게 비트 단위로 폭이 셋팅된 멤버를 비트필드(bit-field) 라고 부른다. 즉, 그 레코드의 특정 필드를 나타낸다.
비트필드를 선언하는 구문은 다음과 같다.
bit_field_member ::= { int | unsigned }1 { identifier }opt : bit_field_width
bit_field_width ::= nonnegative_constant_integral_expression
즉, 비트필드는 정수형 멤버만 가능하며, 폭은 음아닌 정수만 가능하다.
폭의 최대값은 워드 길이와 같다. 즉, 32 비트 컴퓨터의 경우 맥시멈 32 까지다.
컴파일러는 비트필드들을 최소의 기계 워드로 packing 한다.
----------------------------------------------------------------------------------------------
[비트필드 타입]
비트필드는 unsigned 비트필드와 int 비트필드 두가지가 있다.
unsigned 비트필드는 당연히 영아닌 음수만 저장이 가능하고, int 형 비트필드는 시스템의존적이다.
다음의 예제를 살펴보자.
예.
struct rcd {
unsigned fd1 : 2 ; // unsigned 비트 필드, 폭 = 2비트
int fd2 : 3 ; // int 비트 필드, 폭 = 3비트
} ;
첫번째 비트필드 fd1 은 2비트이므로, 2의 2승 개, 즉 4개의 정보가 저장이 가능하다.
즉, 0, 1, 2, 3
두번째 비트필드 fd2 는 3비트이므로, 2의 3승 개, 즉 8개의 정보가 저장이 가능하지만, int형 이므로, 저장할 수 있는 형태는 시스템에 의존적이다. 어떤 시스템에서는 폭이 얼마건 간에 최상위 비트를 부호비트로 사용한다.
또한, 시스템마다 비트와 바이트를 워드의 상위부터 카운트 하는지, 하위부터 하운트 하는지가 다르기 때문에 비트필드를 사용한 코드를 다른 시스템에 이식할때는 주의를 요한다.
int 형 비트필드를 테스트 해보기 위해 다음과 같은 간단한 코드를 돌려본다.
예.
#include<stdio.h>
typedef struct { unsigned fd1 : 2 ; int fd2 : 3 ; } rcd;
int main(void){
rcd a={0}; // 구조체 초기화
int i;
for(i=0;i<=16;i++)
printf("a.fd1= %u \t\t a.fd2= %d\n",a.fd1++ , a.fd2++);
return 0;
}
위의 루프는 각 멤버를 1씩 증가시키면서 배정하고, 출력한다.
아래는 나의 실행결과이다.
즉, 두번재 비트필드 3비트 중에 최상위 비트가 부호 비트로 쓰였음을 알 수 있다.
그래서 011 = 3 다음에 100 = 4 가 입력되었지만, 첫비트가 부호비트인데 오버플로우 되어서 100 = -4 로 해석된 것이다.
마찬가지로, 5 = 101 은 -3 으로, 6 = 110 은 -2 로 , 7 = 111 은 -1 이 되었다. 그리고 이후로 폭을 넘는 값은 잘려서 버려졌음을 알 수 있다.
즉, 현재 나의 환경에서는 int 비트빌드가 32비트보다 작더라도, 음수를 입력할수 있으며, 양수를 오버플로우시켜서 최상위의 부호비트를 변화시켜 음수로 해석되도록 할 수도 있다.
또한, 입력된수의 이진값이 비트필드의 폭을 넘어가는 경우에, 인접한 비트필드로는 오버플로우 되지 않음을 알 수 있다.
---------------------------------------------------------------------------------------------------
[비트필드 얼로케이션]
컴파일러가 비트들을 좌에서 우로 할당하느냐 또는 우에서 좌로 할당하느냐 하는 것은 시스템에 의존한다.
대부분의 컴퓨터에서는 비트필드가 워드 바운더리(word boundary) 에 걸치지 않도록 할당한다.
컴파일러가 비트필드를 어떻게 배치시키는가를 알아보기 위해, 각자 프로그램을 작성해 보자.
다음의 첨부파일은 내가 사용중인 컴파일러가 비트필드를 어떻게 배치시키는가 알아보려고 만들었다.
프로그래밍 팁 : 구조체의 경우는 << 나 >> 연산자로 바로 다룰수가 없다. 그래서, int 형과 함께 공용체로 묶어서 새로운 타입을 정의한후에, 구조체 데이터를 공용체에 배정하고, 공용체의 int형으로 읽어들이면, << 와 >> 로 접근 가능하다. 물론 이것말고도 방법은 여러가지다.
실행화면.
그림을 보면, 첫번째 비트필드 2비트를 최하위에 배치하고, 그다음 비트필드 3비트를 그것의 상위 3비트에 배치했음을 알 수 있다.
따라서, 하위비트부터 차례대로 비트필드를 얼로케이션한다는 것을 알 수 있다. ( 물론 이것은 나의 환경에서 그렇다는 것이다. )
----------------------------------------------------------------------------------------------------
[비트필드 정렬]
앞에서 구문을 보면, identifier 가 option 으로 되어있는 것을 볼 수가 있다. 즉, 사용하지도 않을 비트필드를 지정할 수 있는데, 이러한 이름없는 비트필드는 패딩이나 얼라인(align)을 위해 사용된다.
즉, 빈 공백을 이름없는 비트필드로 메꿔넣음으로 해서, 이후에 사용할 비트필드를 그다음 워드의 앞자리로 이동시키거나 할 때 쓰면 된다.
가령 4바이트 워드에서 다음과 같은 워드를 두개 사용하는 구조체를 고려하자.
struct abc { unsigned i1:7, i2:7, i3:7, :11, // 이름없는, 폭11 짜리 비트필드는
i4:7, i5:7, i6:7; // 그 다음 비트필드가 다음 워드에 오도록 한다.
};
바로 다음워드에 정렬하는 또다른 방법은 폭이 0 인 이름없는 비트필들르 사용하는 것이다.
struct abc { unsigned i1:7, :0 , i2:7, :0, i3:7 ; }; // :0 은 다음 워드까지 빈필드로 채운다.
이것은 세개의 다른 워드에 세 개의 7비트 필드를 만들게 한다.
-------------------------------------------------------------------------------------------------
앞에서 이미 언급했듯이 구조체 뿐만 아니라 공용체에 대해서도 비트필드를 사용할 수 가 있는데, 구조체, 공용체, 그리고 비트필드를 적절히 조합하면 많은 기술들을 구현할수 있다.