이진수의 합과 곱

zihado의 이미지

안녕하세요.

여쭈어 볼 것이 있어서 이렇게 글을 남깁니다.

두 이진수를 입력받아 합과 곱을 출력하는 프로그램을 짜는 건데요

십진수로 바꾼 다음에 계산하여 다시 이진수로 하면 안된다고 하네요 -_-;

이진수로만 연산하라고 하는데..

좋은 방법이 떠오르지 않습니다.

생각하기로는 배열을 잡아서

각 자리를 논리연산해서 그 결과를 저장해 출력하는건데

이것 역시 쉽지 않네요

도움 좀 부탁합니다!

서정민의 이미지

덧셈은..

같은 자리수의 값을 더하는 형식으로 해야겠지요? 거기에 carry flag가 필요할 것이고요..

곱셈은..

그러한 덧셈 알고리즘을 그대로 쓰시면 됩니다. 0101 * 1000 일 경우는 101을 1000(binary)번 더해주면 되니까요 ;)

버그소년의 이미지

2진수로 연산하라는 말이...

곱셈은 윗분 말씀처럼 계속 더해도 되지만...

예를 드신 0101 * 1000 의 경우는

0101을 좌측으로 3bit쉬프트 하면 됩니다.

5 * 8 = 40

0101 * 1000 = 0101 000

좌로 쉬프트 하는것은 * 2가 되니까 다음과같이 쉬프트 후 합하면 됩니다.

8 * 5 = 40

1000 * 0101

0101중 3번째 자리가 1이므로 좌로 2번 쉬프트 100000
0101중 1번째 자리가 1이므로 그냥 1000
--------------------------------------------------------------------
두수를 더하면 101000

이런식으로 계산됩니다.

가끔은 밥을 굶어도 살 수 있다.

Necromancer의 이미지

초등학교 산수시간에 뭐했는지 생각해보세요.
덧셈의 경우 우리가 쓰는 10진법에서는
각 자리수별로 더하되, 합이 10을 초과할 경우 윗자리로 올려서 더하죠?
2진법에서도 똑같이 적용됩니다. 각 자리별로 덧셈을 해서 만일 2이상의
숫자가 나오면 바로 위로 올려서 더하면 됩니다.
10진법하고의 차이는 자릿수 합이 10이 아닌 2가 나올 때 윗자리로 올라간다는 겁니다.

곱셈도 산수시간에 나온 대로 하고요.
2진수의 구구단은 아래와 같이 됩니다.

0X0 = 0
0X1 = 0
1X0 = 0
1X1 = 1

곱셈은 이게 다입니다.
한가지 예를 드리자면...
1010X1101 을 계산한다고 하면 아래와 같이 됩니다.

           1010
         X 1101
---------------
           1010     ---> 1101 의 가장 아랫자리 1과 1010이 곱해진값
          0000      ---> 1101 의 두번째 자리 0과 1010이 곱해진값
        1010        ---> 1101 의 세번째 자리 1과 1010이 곱해진값
       1010         ---> 1101의 가장 윗자리 1과 1010이 곱해진값
----------------
       10000010 ---> 4개 수 다 더하세요.

Written By the Black Knight of Destruction

vacancy의 이미지

곱셈 시에는 Booth's Algorithm도 있습니다.

라키시스의 이미지

부스의 알고리즘 (Booth's Algorithm)

여러개의 인스트럭션 사이클을 필요로 하는 곱셈의 연산을

쉬프트 연산과 가산기를 이용해서 보다 적은 인스트럭션 사이클 내에 수행해 내도록 하는 알고리즘입니다.

자세한 알고리즘들은 디지탈 설계 (공부한지 오래되어서 기억이 가물가물하네요 ^^;) 관련된 책들을 찾아 보시면 나올것입니다.

기억나는 책은.. Computer System Architecture 던가...

보다 더 효율적으로 수행하기 위해서 수정된 Modified Booth's Algorithm 도 있습니다 :)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.