|
Test해 봤는데 AnsiString이 SHift되는게 이상하군요. 뭔가 모르는게 있었나 봅니다.
해결책은 Edit5->Text의 값을 char형또는 Int형으로 변환후 사용하세요.
주의해야 할것은 Edit5->Text값 자체를 shift할것인지, 아니면 Edit5->Text값의 숫자를 shift할것인지 나와있지 않은데요. 뭔이야기냐면 Edit5->Text값에 "1"이 들어가 있다면 1 << 7로 shift할것인지 아니면 49 << 7로 할것인지가 나와있지 않다는겁니다. 여기서 49는 "1"의 Ascii code값입니다.
StrToInt(Edit5->Text)값은 1이 되고(Int형으로 변환), Edit5->Text[0]의 값은 49입니다.
그리고 char형을 << 7로 shift하면 하위 1비트만 남고 상위비트들은 모조리 잘려나간다는건 잘 아시죠?
어쨋건 Edit5->Text에 "1"을 집어넣고 shift하니까 << 6 까지는 '1 << 숫자' 형태로 변환되더군요.
아래 수정문의 예는 char형으로 변환한것입니다.
heartsim 님이 쓰신 글 :
: 안녕하세요.빌더 초보입니다.
: 비트 시프트 연산과 관련해 질문이 있어서요.^^
: 먼저 관련 소스입니다.
:
: char TotalData[3]={0,0,0};
char cBaseData = Edit5->Text[1]; // <== char형으로 변환.
:
: TotalData[0]=16;
: TotalData[1]=1;
:
: if(Table1->FieldByName("Name")->AsString=="NTPAL")
: TotalData[2]=TotalData[2] | Edit5->Text;
: else if(Table1->FieldByName("Name")->AsString=="CCD")
TotalData[2]=TotalData[2] | cBaseData << 1 ; // <== 아래도 이렇게 수정
: TotalData[2]=TotalData[2] | Edit5->Text<<1;
: else if(Table1->FieldByName("Name")->AsString=="YDOUT")
: TotalData[2]=TotalData[2] | Edit5->Text<<2;
: else if(Table1->FieldByName("Name")->AsString=="UVDOUT")
: TotalData[2]=TotalData[2] | Edit5->Text<<4;
: else if(Table1->FieldByName("Name")->AsString=="REC601")
: TotalData[2]=TotalData[2] | Edit5->Text<<5;
: else if(Table1->FieldByName("Name")->AsString=="DSYNC")
: TotalData[2]=TotalData[2] | Edit5->Text<<6;
: else if(Table1->FieldByName("Name")->AsString=="SG135")
: TotalData[2]=TotalData[2] | Edit5->Text<<7;
:
: for(int i=0;i<3;i++)
: {
: ComPort1->WriteStr(TotalData[i]);
: }
:
: 위와 같습니다.
: 일단 시프트는 <<(왼쪽으로) 이동하는게 맞는 것 같은데요...
: 그리고 WriteStr을 전송할 때 TotalData를 AnsiString형이 아닌 char형으로 했습니다.
: 여기까지는 프로그램이 돌아가는 것으로 봐서는 문제가 없는 듯........
: 그런데...
: 맨 끝에 Edit5->Text<<7로 했을 때, 1로 세팅을 하면 invalid라고 에러가 나더군요.
: 물론 원인은 char형으로 해서인지 1xxx xxxx로 자리수를 넘어서서 그런 것 같습니다.
: 일단은 int형이나 unsigned형으로 하고 시리얼 전송을 해보니 결과 값이 다르게
: 나오더군요.
: 해결책이 없을가요?
: ^^
:
:
: 즐거운 하루되세요.
:
:
:
:
:
:
:
|