C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[74026] Re:Re:Re:[질문] 많은데이타 처리건
StarWagon [starwagon] 3570 읽음    2016-12-07 12:19
이 방법 신박하네요. ㅋㅋ
비교가 추가되기 때문에 시간이 쪼금 더 걸리지만, (0.4sec vs 0.5sec)
그걸 무시할 수 있을 정도로 메모리 절약이 엄청나니, (400mb vs 12mb)
이 방법이 더 낫겠네요. 이번에도 볼포에서 많이 배웁니다. ㅎㅎ

1바이트에 8개의 비트가 있으므로 100000000 개의 참/거짓 값을 100000000 /8=12500000 개의 변수(1바이트)로 표현 가능합니다.
즉 1바이트 변수 하나로 8개의 참/거짓을 저장 할 수 있다는 거죠.

00000001=1;
00000010=2;
00000100=4;
00001000=8;
...
10000000=2^7;

만약 1바이트 변수값이 3이라면 2진수로 00000011 이므로
6개의 거짓값과 두 개의 참 값이 저장되어 있다고 할 수 있습니다.

이런건 해보지 않고는 손이 근질거려서 못참기에 구현한 예제를 올립니다.


struct PHONENUMBER {
    short f,r;
    AnsiString GetNumber() {
        AnsiString s;
        s.printf("010-%04d-%04d",f,r);
        return s;
    }
};
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TDateTime N=Now();

    char *a = new char[100000000/8];
    memset(a,0,sizeof(char)*100000000/8);

    int num,idx,bit;
    // 010-0000-0000
    // 010-0000-0001
    // 010-0001-0000 을 뽑지 않도록 미리 해당 비트를 1로 채움
    a[0]=3;
    num=10000;
    idx=num/8;
    bit=num%8;
    a[idx]|=(int)pow(2,bit);


    int ExtractionCount=400000;
    int Extracted=0;
    PHONENUMBER *result=new PHONENUMBER[ExtractionCount];

    randomize();
    while(Extracted<ExtractionCount) {
        num=random(100000000);
        idx=num/8;
        bit=num%8;
        if (!a[idx]&(int)pow(2,bit)) {
            a[idx]|=(int)pow(2,bit);
            result[Extracted].f=num/10000;
            result[Extracted].r=num%10000;
            Extracted++;
        }
    }

    N=Now()-N;
    ShowMessage(N.FormatString("s.zzz"));

    for (int i = 0; i < Extracted; i++) {
        Memo1->Lines->Add(result[i].GetNumber());
    }

    delete[] a;
    delete[] result;

}
//---------------------------------------------------------------------------


+ -

관련 글 리스트
74007 [질문] 많은데이타 처리건 하안인 3675 2016/11/28
74021     Re:[질문] 많은데이타 처리건 지나가다 3640 2016/12/05
74023         Re:Re:[질문] 많은데이타 처리건 3565 2016/12/06
74026             Re:Re:Re:[질문] 많은데이타 처리건 StarWagon 3570 2016/12/07
74014     Re:[질문] 많은데이타 처리건 StarWagon 3551 2016/11/29
74018         Re:Re:[질문] 많은데이타 처리건-감사합니다. 하안인 3513 2016/12/01
74010     Re:[질문] 많은데이타 처리건 라스코니 3491 2016/11/29
74011         Re:Re:[질문] 많은데이타 처리건 하안인 3482 2016/11/29
74012             Re:Re:Re:[질문] 많은데이타 처리건 라스코니 3540 2016/11/29
74008     Re:[질문] 많은데이타 처리건 StarWagon 3558 2016/11/29
74009         Re:Re:[질문] 많은데이타 처리건 하안인 3534 2016/11/29
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.