ILoveCoffee, ILoveJava

간단한 코딩으로 곱셈 나눗셈 하기

jeeyong 2007. 12. 17. 11:35

요즘 c/c++강좌가 올라오면서 파코즈에도 프로그램 열풍이 불고 있는 듯합니다..^^

저도 같이 공부하고 서로 정보 공유하자는 차원에서 중급코딩시 유용한 팁하나 소개할까합니다.


매우 간단한건데요. c/c++ 연산자들 중에는 비트연산자(<<, >>) 가 있습니다.


비트연산자란 간단히 말해 0과1  2진수로 표현되어있는 기계어를 비트연산자를 이용해서 계산하는 방법으로

컴퓨터가 이해하기 쉬운 비트를 계산해 속도가 빠르다는 장점을 가지고 있습니다.


잡소리 그만하고 본론으로 바로 설명들어가자면..


a 라는 변수의 2배수를 구하고 싶다면..


a = a*2; 이런 코딩이 나오겠지요


이 식을 비트연산자로 바꾸면 이렇게 됩니다.


a = a<<1; (이 식을 풀이 하자면 "a의 비트값을 왼쪽으로 쉬프트 시켜라!" 라고 하는 소리입니다.)


예를 들어 보겠습니다. a 에 5를 대입하고 계산해 보도록하죠

먼저 위의 코딩에서는 5*2 이기 때문에 a 에는 10 이라는 상수가 들어가게 됩니다.


그럼 이번에는 아래 코딩이 어떻게 계산하는지를 살펴보겠습니다.

우선 비트연산이기 때문에 a에 5라는 상수를 2진수로 변환하게 됩니다.

(사실 컴퓨터는 5라는 수를 2진수로 해석해 놓고있기때문에 다른 변환 작업이 없습니다.)

5를 2진수로 변환하면 0101 이 되겠습니다.

위의 식을 풀면

0101<<1

이렇게 되겠는데요.. 말그대로 위의 4비트를  왼쪽으로 옮겨주면 됩니다. 왼쪽으로 1칸씩 이동시키면

0101

1010

이렇게 변환이 됩니다. 2진수를 10진수로 변환하는 방법은 알고계시리라 생각됩니다.
 

1비트를 << 시키면 2배수, 2비트를 << 시키면 4배수, 3비트를 << 8배수,......

이런식으로 배수 계산을 하면됩니다.

나눗셈은 반대로 >> (오른쪽 쉬프트) 를 이용하시면 됩니다.


호응이 좋으면 3배,5배,6배,7배,....60배...등등 응용해서 배수를 연산할수있는 방법을 알려드리겠습니다.


 예전에  파코즈 라는 사이트에 내가 올렸던 글이다. C언어를 공부하면서 자연스럽게 어셈블리어에 대해 알게 되고 그러면서 어떤식으로 CPU연산하는지에 대해서까지 공부했던 기억이 난다..ㅡㅡ; 매번 느끼는 것이지만 정말 빡시다. 하나를 알게되면 2~3개는 덤으로 따라온다.
 위에서는 성능향상에 도움이 된다고 했는데 자바에서 얼마나 성능 향상이 있을지에 대해서는 확인해보지 않았다. 그 이유는 자바의 특성상 저런 연산으로 그다지 성능향상을 기대할 수 없다는 판단에서 그런것 같다.