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
[51142] Re:이진수로
장성호 [nasilso] 1986 읽음    2007-11-02 16:39
비트연산을  잘 이용하시면....

방법1. 
   ; char 배열 32선언해 두시구요
     0~ 255번째까지 순번대로 상태를
        setting하는 함수( high and low ) 와 ,   
        현재 상태값을 가져오는 함수 만들어 쓰시면 될겁니다.

  아래 샘플은 회사 업무에 사용했던 코드입니다.
  회사업무에서는 10Byte만 썼는데.. 32Byte로 선언만 바꿨네요
 
//=========================================================================  
BYTE UPCHK[32];
BYTE GetState(BYTE idx)
{
    if(idx>=(sizeof(UPCHK)*8))return 0;
    return UPCHK[idx/8]&(0x01<<idx%8);
}
//------------------------------------------------------------------------
void SetState(BYTE idx,BYTE onoff)
{
    if(idx>=(sizeof(UPCHK)*8))return;
    if(onoff)UPCHK[idx/8]=UPCHK[idx/8]|(0x01<<idx%8);        // 1로 셋팅
    else UPCHK[idx/8]=UPCHK[idx/8]&(0xFF ^( 0x01<<idx%8));   // 0 으로 셋팅
}
//=========================================================================

   <<사용예>>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if(GetState(23))ShowMessage("High");
    else ShowMessage("Low ");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    SetState(23,1); //23번째 값을  high 로 설정
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    SetState(23,0); //23번째 값을  low 로 설정
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
    String str="";
    int len=sizeof(UPCHK)/sizeof(char);
    for(int i=0;i<len;i++)str=str+IntToHex(UPCHK[i],2)+" ";
    Memo1->Text=str;   //전체 32bit 배열에 hex값을 memo장에 뿌려줌
}
//---------------------------------------------------------------------------


 
방법2
   ; union을 써서 bit 플래그로 만들어 쓰는 방법이....

typedef union _UMC{
    unsigned char CH[32];                     /*  Byte Access */
    struct {                                /*  Bit  Access */
        unsigned char B0             :1;
        unsigned char B1             :1;
        unsigned char B2            :1;
        unsigned char B3            :1;
        unsigned char B4            :1;
        unsigned char B5             :1;
        unsigned char B6            :1;
        unsigned char B7            :1;
                                .....
                                unsigned char B254                                :1;
        unsigned char B255                                :1;
    } BIT;
}UMC;

void __fastcall TForm1::Button5Click(TObject *Sender)
{
    UMC mc;
    mc.BIT.B245=1;
    mc.BIT.B23=1;
}
//---------------------------------------------------------------------------


....

첫번째 방법은 계산식이 헷갈리실건데...
XOR와 Shift 연산 좀 쓴것 뿐입니다.

두번째 방법이 더 명시적이죠?
두번재 방법은 1Byte만 bit로 만들어서,  그것을 32개 선언해서 쓰는 방법도 있습니다.

그럼..


조상진 님이 쓰신 글 :
: 안녕하세요.. __);
:
: 프로젝트 중인데 혹시나 좋은 방법 알고 계시는분이 계실것 같아 질문 드립니다.
:
: 감시대상 기기의 매칭 테이블을 만들어 사용하기로 했습니다.
:
: 총 32바이트로 1비트당 1대이므로 8 * 32 = 256대까지 관리할 수 있는데요.
:
: 예로 11, 7, 3 번만 관리하고 싶다면 00001000 10001000 이 되므로 10진수 2184가 됩니다.
:
: 이건 그냥 코드에 하드코딩해서 넣어주면 되는데요..
:
: 문제는
:
: typedef struct {
:   unsigned int Table1;
:   unsigned int Table2;
: ...
:
: (1) Table1 = 2184 <- 이렇게 해줘봐야 전혀 명시적이지가 못하더군요.
:
: (2) Table1 = 00000000 00000000 00001000 10001000 이런식으로 해주면 명시적일텐데 말입니다..;;
:
: 물론 주석으로 친절히 설명을 달아놓으면 되겠지만, 사양이 변하거나 감시 대상이 바뀌면 다시 일일이 계산해 봐야 할텐데요..
:
: 무언가 좋은방법 없을까~ 싶어서 조언 구합니다.
:
: int x = 0x0888 처럼 
: int x = B00000000000000000000100010001000  요런식으로 넣어주는 방법 없을까요?
:
: 그럼.. 부탁드립니다.. __);

+ -

관련 글 리스트
51138 이진수로 "입력" 이 가능하던가요.. ? 조상진 2820 2007/11/02
51142     Re:이진수로 장성호 1986 2007/11/02
51148         Re:Re:우왓.. 감사합니다.. __);; 조상진 1356 2007/11/05
51139     Re:이진수로 문제진 1535 2007/11/02
51140         Re:Re:흑흑.. 안타깝게도.. 조상진 1446 2007/11/02
51141             Re:Re:Re:그렇다면... 문제진 1340 2007/11/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.