'Programming'에 해당되는 글 3건

  1. 2011.06.03 2진수로 데이터 표현 1
  2. 2011.06.02 2진수
  3. 2011.02.03 [C/C++] Caesar cipher

 컴퓨터는 2진수를 이용하여 데이터를 저장하고 연산한다.


 1bit은 0인지 1인지 표기하는 일종의 '자리수'고, 1byte는 8bit을 말한다.
1byte에는 0~7까지 총 8개의 자리가 있으므로, 1000 0000 은 10진수로 2^7을 의미한다.
즉, 1byte는 0부터 2^8-1(=255) 까지 총 256개의 숫자를 표현할 수 있다.


컴퓨터는 정수를 표현할 때, 1byte에서 가장 앞 자리 수를 MSB로 남겨둔다.
MSB는 most significant bit의 이니셜로, 부호를 나타낸다.
0이면 양수, 1이면 음수.

음수를 만드는 방법은 간단하다.
해당 값에서 NOT 연산을 취한 후, 1을 더하면 된다.

원리는 inverse element(역원)을 더하는 것이다.
간단하다.

그냥 단순히 MSB를 바꾼다고 음수가 되지 않는다.
올바른 음수를 만드는 방법은 양수의 역원을 찾는 것이다.

그냥 심심해서 색 상자 써 봤다.
ㅋㅋ.


실수는 조금 복잡하다.
2byte를 사용하는데, 하나는 지수부, 하나는 유효숫자를 나타낸다.
즉 16개의 bit가 다음과 같다고 하자.

[] [] [] [] [] [] [] [] // [] [] [] [] [] [] [] []
앞에 진하게 표기된 부분이 MSB이다. s라고 하자.
그 뒤 7개는 지수부를 의미한다. e라고 하자.
마지막 1byte는 유효숫자를 나타낸다. sf라고 하자.
그러면 결과는 다음과 같다.



여기서 sf는 자리수를 생각하지 않고 그냥 넣은 숫자이다.

조금 복잡하다ㅋ


그리고!
위 표기법으로는 0을 만들 수 없다. 항상 양수거나, 음수이다.
r은 0을 지나지 않는다.
그렇기 때문에 오차가 존재한다.

오차에 대한 얘기는 다음으로 미룬다.

'★ 수학 이야기 > ▣ 플밍 이야기' 카테고리의 다른 글

2진수  (0) 2011.06.02
ASCII(American Standard Code for Information Interchange) tables  (0) 2011.06.02
[C/C++] Caesar cipher  (0) 2011.02.03
원주율 근사  (0) 2011.01.02
Posted by White Joker

 n진수는 n개의 숫자로 구성된 수 체계를 말한다. 우리는 0, 1, 2, ..., 9의 총 10개의 숫자를 이용하는 수 체계를 일반적으로 사용하므로, 10진수를 사용한다고 볼 수 있다.

 우리가 새로운 꼬부랑 문자를 첨가하여, 가령 예를 들면 ★을 9+1 의 숫자로 정의하면 11진수를 만들 수도 있다.
그러면 ★ + 7 = 16이 된다. 이 수를 10진수로 변환하면 물론 17이다.

 2진수는 0과 1을 사용하는 수 체계를 말한다. 여기선 1+1 = 10이다. 이 수를 10진수로 변환하면 2가 된다.


 우리는 여기서 재미있는 규칙을 발견할 수 있다.

 n진수에서 10을 10진수로 변환하면 n이 되고, 따라서 n진수의 100을 10진수로 변환하면 n^2이 된다. 같은 방법으로, 1000은 n^3이 된다.

즉, k번째 자리수의 숫자는 n^k의 단위를 가진다.


 우리가 일반적으로 사용하는 10진수 체계에서, 100은 백의 자리수라고 표현하는 것과 같은 이치이다.

 단지 익숙함의 정도 차이이다.
Posted by White Joker

Caesar cipher는 고대 로마 황제 Julius Caesar가 만든 기본적은 substitution cipher를 말한다.
카이사르 또는 시져라고 읽는다.

http://hypertimespace.tistory.com/150

이전 암호포스트에서 언급한 적 있다.

쓰기 귀찮으니까 글을 옮겨오자면...

암호화는 간단하다. 알파벳을 순환고리라고 생각하고 n번 만큼 알파벳을 옮기면 된다.


n=3
p = ABCZYX
이라고 하면,

c = E_3(p)= DEFCBA
가 된다.

복호는 -n만큼 알파벳을 옮기면 되므로,
d=DEFCBA라고 하면,

p = D_n(c) = ABCZYX
를 얻을 수 있다.

p = ABCZYX
n = 3 (Caesar cipher)
c = E_3(p) = DEFCBA


물론 여기서 E_n^-1 = D_n = E_(-n) 이다.



이게 시저암호다.

이것을 C로 구현해 보자. (C++은 아직 공부 시작도 안했다.....ㅋㅋ)

#include <stdio.h>
int main(void)
{
 char code[100];
 int i=0,j=1;
 printf("문장을 입력해 주세요. \n>");
 gets(code);
 printf("\n%s을 입력하셨습니다.\n\n",code);
 for(;j<26;j++,i=0)
 {
  for(;code[i]!='\0';i++)
  code[i]=decrypt(code, i, j);
  printf("%d 번 위치를 이동시킨 코드 결과:\n%s\n",j,code);
 }
 return 0;
}
int decrypt(char code[100], int i, int j)
{
 if((64<code[i] && code[i]<91)||(96<code[i]&&code[i]<123))
 {
  code[i]++;
  if(code[i]==91)
   code[i]-=26;
  if(code[i]==123)
   code[i]-=26;
 }
 return code[i];
}

뭐 별로 어렵지 않다.

프로그래밍에 투자할 시간은 별로 없지만, 그래도 책 하나 사서 보고 있다. 그래야지 뭐라도 좀 알 수 있겠더라..ㅋㅋ
코드를 해석해 보자.

#include <stdio.h> // stdio라는 이름의 헤더 파일을 불러온다. 기본적인 함수들이 들어가 있다.
int main(void) // integer형태(처음 봤을 땐 initial인줄 알았지ㅋㅋ)를 return하는 main이라는 이름의 함수다. argument는 없다. main이라는 함수는 컴파일 할 때 자동으로 먼저 불러온다.
{
 char code[100]; // character 변수 설정.
 int i=0,j=1; // integer 변수 설정.
 printf("문장을 입력해 주세요. \n>");
 gets(code); // 입력값 받음.
 printf("\n%s을 입력하셨습니다.\n\n",code);
 for(;j<26;j++,i=0) // 이제부터 하나하나 알파벳을 돌리는 거닼ㅋ
 {
  for(;code[i]!='\0';i++) // 입력값들을 하나하나 분석한다. null 문자(마지막에 붙는)가 올 때가지 반복.
  code[i]=decrypt(code, i, j); // decrypt 함수를 사용한다. 변수는 3개ㅋ
  printf("%d 번 위치를 이동시킨 코드 결과:\n%s\n",j,code); // 결과값 출력.
 }
 return 0; // 함수 종료.
}
int decrypt(char code[100], int i, int j) // decrypt 함수 set. interger 형태 반환, 변수는 code, i, j 3개.
{
 if((64<code[i] && code[i]<91)||(96<code[i]&&code[i]<123)) // code의 문자가 영어 대문자와 소문자일 경우.
 {
  code[i]++; // 그 값을 1개씩 증가. (아스키값)
  if(code[i]==91) // Z에서 1개 증가할 경우.
   code[i]-=26; // A값으로.
  if(code[i]==123)
   code[i]-=26;
 }
 return code[i]; // 결과값 return.
}

끝?

끝.

좀 불친절한데? ㅋㅋ



이렇게 총 25번을 반복한다는 거...



영문자만 변환.

'★ 수학 이야기 > ▣ 플밍 이야기' 카테고리의 다른 글

2진수로 데이터 표현  (1) 2011.06.03
2진수  (0) 2011.06.02
ASCII(American Standard Code for Information Interchange) tables  (0) 2011.06.02
원주율 근사  (0) 2011.01.02
Posted by White Joker