|
비트연산을 잘 이용하시면....
방법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 요런식으로 넣어주는 방법 없을까요?
:
: 그럼.. 부탁드립니다.. __);
|