1byte가 8비트가 아닐경우도 고려해서 프로그램을 짜야하나요.

kkb110의 이미지

STL에 시퀸스 컨테이너 요구사항을 만족시키는
컨테이너를 코딩중인데요.

동작하는 시스템이 1byte가 8bit가 아닐경우도 고려해서 프로그램을 짜야할까요?

제 컨테이너는 unsigned int 형식의 로그를 구해야하는데 간략한 코드는 이렇습니다.

unsigned indexfunc10 ( unsigned n )
{
if ( n > 0x80000000 ) return 32;

unsigned t, log2;

if ( n > 0x8000 ){log2 = 16;t = 0x800000;}else{log2 = 0;t = 0x80;}
if ( n > t ){log2 += 8;t <<= 4;}else{t >>= 4;}
if ( n > t ){log2 += 4;t <<= 2;}else{t >>= 2;}
if ( n > t ){log2 += 2;t <<= 1;}else{t >>= 1;}
if ( n > t ){log2 += 1;}
return log2;
}

unsigned를 이진수로 표현했을때 가장 윗자리수있는 1이 몇번째 있느냐 하는 문제와도 같죠.
근데 문제는 이게 1바이트가 8비트라는 가정을 한다는겁니다.

물론 잘 코딩해서 1바이트가 8비트가 아닐때도 잘동작하는 코드를 작성할수 있긴 한데 문제는 성능이 안나온다는거죠.

만약 여러분들이라면 어떤선택을 할지 궁금하군요. -_-;

cdpark의 이미지

이 코드의 문제는 당장 unsigned가 4 byte라는 가정일 듯 싶은데요?

cdpark의 이미지

대충 펜티엄3 800 기준으로 그런대로 빠른 코드였습니다. 앞부분을 loop로 처리하면 되지 않을까요?

int h3[32]={0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
            5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5};

int hibitn(int n)
{
        int k=0;

        while ( n >= 1024 )
        {
                n/=1024;
                k+=10;
        }

        if ( n >= 32)
        {
                n/=32;
                k+=5;
        }

        return k+h3[n];
}
익명 사용자의 이미지

Byte 문제는 해결했습니다.

if(size/2 != 0) {if ((unsigned)index > i<<size/2) {i <<=size/2;j+=size/2;}}
if(size/4 != 0) {if (index > i<<size/4) {i <<=size/4;j+=size/4;}}
if(size/8 != 0) {if (index > i<<size/8) {i <<=size/8;j+=size/8;}}
if(size/16 != 0) {if (index > i<<size/16) {i <<=size/16;j+=size/16;}}
if(size/32 != 0) {if (index > i<<size/32) {i <<=size/32;j+=size/32;}}
if(size/64 != 0) {if (index > i<<size/64) {i <<=size/64;j+=size/64;}}
if(size/128 != 0) {if (index > i<<size/128) {i <<=size/32;j+=size/128;}}

이런 꼴로 하면 컴파일러가 알아서 최적화 시켜주더군요. unsigned 가 4byte 일때 위 코드와 이 코드는 vc7에서 정확히 같은 명령어를 생성해냈습니다.

kkb110의 이미지

바로위글 접니다. 허허 지울수도 없고 -_-;; 빠진부분이 있어서 올립니다.

unsigned int i=1;
char j=0;
const int size = stdnumeric_limits<unsigned char>digits * sizeof(T);
if(size/2 != 0) {if ((unsigned)index > i<<size/2) {i <<=size/2;j+=size/2;}}
if(size/4 != 0) {if (index > i<<size/4) {i <<=size/4;j+=size/4;}}
if(size/8 != 0) {if (index > i<<size/8) {i <<=size/8;j+=size/8;}}
if(size/16 != 0) {if (index > i<<size/16) {i <<=size/16;j+=size/16;}}
if(size/32 != 0) {if (index > i<<size/32) {i <<=size/32;j+=size/32;}}
if(size/64 != 0) {if (index > i<<size/64) {i <<=size/64;j+=size/64;}}
if(size/128 != 0) {if (index > i<<size/128) {i <<=size/32;j+=size/128;}}

오 저코드도 상당히 빠르네요!
감사합니다! ^^

정말 예리해요~ 한수 배우고 갑니다~

IsExist의 이미지

1바이트가 8bits 가 아닌 한가지 머신이 있었던걸로 기억합니다.
메인프레인급이였나 아마 그랬던거 같군요. 9비트로 사용한 걸로
알고 있습니다.

요즘 대부분의 환경이라면 8비트가 맞을듯 하군요.
기계어 수준에서도 머신의 기본 연산 단위가 가장 빠르죠.
32비트 머신에서는 32비트가 기본 연산 단위라 1바이트로 충분한 데이타도
4바이트로 사용합니다. 효율을 위해 CPU 자체도 메모리 접근이 그 배수로
접근하게 만들어집니다.

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

Necromancer의 이미지

VMS 기종이었던가... 하여튼 메인프레임중에 1Byte=12bit인 기종이 하나 있는걸로 압ㄴ다.

Written By the Black Knight of Destruction

crimsoncream의 이미지

저라면 스펙에 1 byte가 8bit가 아닌 환경에서는 동작을 보장하지 않는다. 혹은 동작하지 않는다고 명시하고 나머지 환경은 무시하겠습니다.

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

kkb110의 이미지

오 답변들 감사합니다~ 정작 8비트가 아닌 시스템이 어떤기종인지 하나도 몰랐었는데 ^^;
그리고 crimsoncream님 의견도 감사합니다 ^^

댓글 달기

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