비트 연산을 이용한 곱셈,나눗셈 구현.

onezero3의 이미지

옛날에 학교에서 배운 쉬프트 레지스터의 원리가 생각나서,,
곱셈과 나눗셈을 쉬프트 연산과 덧셈만으로 구현해 보았습니다.

여기에서 long 은 32비트임을 전제로 합니다.

/*+-------------------------------------------------------------------------+
  |  FILE: math.c                                                           |
  |  Version: 0.1                                                           |
  |                                                                         |
  |  Copyright (c) 2003 Chun Joon Sung                                      |
  |  Email: chunjoonsung@hanmail.net                                        |
  +-------------------------------------------------------------------------+*/
long multiply(multiplicand, multiplier)
long multiplicand;
long multiplier;
{
    long i=0, sign=0, sum=0;

    if( multiplicand & (1<<31) )
    {
        multiplicand = ~multiplicand + 1;
        sign++;
    }
    if( multiplier & (1<<31) )
    {
        multiplier = ~multiplier + 1;
        sign++;
    }
    for(i=0, sum=0; i<32; i++)
    {
        if( (multiplier>>i) & 0x01 )
            sum += (multiplicand<<i);
    }
    if( sign & 0x01 )
    {
        sum = ~sum + 1;
    }
    return sum;
}

long divide(dividend, divisor)
long dividend;
long divisor;
{
    long i=0, sign=0, div=0, mod\0;

    sign = 0;
    if( dividend < 0 )
    {
        dividend = ~dividend + 1;
        sign++;
    }
    if( divisor < 0 )
    {
        divisor = ~divisor + 1;
        sign++;
    }
    if( dividend < divisor )
    {
        div = 0;
    }
    else
    {
        for(i=0; i<32; i++)
        {
            if( dividend < (divisor<<i) )
            {
                if( i > 0 ) i--;
                break;
            }
            else if( dividend == (divisor<<i) )
            {
                break;
            }
        }

        div = 0;
        for(; i>=0; i--)
        {
            if( dividend < divisor )
                break;

            if( dividend >= (divisor<<i) )
            {
                dividend -= (divisor<<i);
                div      += (1<<i);
            }
        }
    }
    if( sign & 0x01 )
    {
        div = ~div + 1;
    }
    return div;
}

long mod(dividend, divisor)
long dividend;
long divisor;
{
    return (dividend - mul(divisor,div(dividend,divisor)));
}

Forums: 
winner의 이미지

매우 재미있습니다.

근데 혹시나 해서 답글답니다.

cedar의 이미지

winner wrote:
매우 재미있습니다.

근데 혹시나 해서 답글답니다.

웬만한 곱셈이나 나눗셈 연산은
쉬프트 연산으로 계산하는 것이 빠른경우
컴파일러가 알아서 변환해줍니다.
개발자가 별도로 이런 최적화를 할 필요가 없죠.

onezero3의 이미지

이 함수는 자체로써는 별 다른 의미가 없는 것 같지만,,
128비트 연산이나 256비트 연산에 확장할 수 있으므로
유용하게 사용할 수 있습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.