2013-07-12 2 views
0

저는 대학 화학과 프로젝트의 학생입니다. 작년에 필자는 피코 모터 스테이지를 제어하고 센서에 접촉 할 때까지 스테이지를 위아래로 움직이는 힘 압력 센서와 통신하도록 C++ 프로그램을 작성했습니다. 이 프로그램을 작성하기 위해 회사에서 제공 한 DLL을 사용했습니다. 그것은 나에게 어느 정도 걸렸다. 그러나 나는 일할 것이 모든 것을 얻었다.C#의 비트 연산

올해 저는 프로그램에 두 번째 단계를 통합하고 전체 프로그램을 C#을 사용하여 GUI로 업데이트 할 것입니다. 두 번째 스테이지와 힘 센서는 C#에서 작동하는 DLL 만 제공하지만 이전 스테이지는 C++에서 작동합니다. 나는이 세 가지를 모두 C# GUI 프로그램에서 작동시킬 수있었습니다.이 문제를 해결하면 거의 끝났습니다 :

이전 프로그램에서 이전 프로그램에서이 기능을 통해 스테이지의 모터가 움직이는 지 확인할 수있었습니다 :

#define MOTOR_MOVING 0x01 
byte isMoving = LdcnGetStat(pico_addr) & MOTOR_MOVING; 

바이트 LdcnGetStat (바이트 주소)는 지정된 주소에서 모듈의 마지막 상태 바이트를 반환합니다. 내가 가진 지침 매뉴얼에 따르면, 비트 0은 모터가 움직일 때 설정되는 것으로 가정합니다. 그래서, 내 C++ 프로그램에서 bool 변수를 사용하여 테스트하면 모터가 움직이지 않을 때 isMoving은 0, 모터가 움직이지 않으면 isMoving은 0이되고 모터가 움직이지 않으면 0으로 즉시 돌아갑니다. 잘 작동합니다.

하지만 C#에서는이 문제가 발생했습니다.

byte isMoving = LdcnGetStat(pico_addr) & MOTOR_MOVING; 

이 작동하지 않아 일부 명시 적 캐스팅을 수행해야합니다. 그래서이 그것을 변경 :

bool isMoving = Convert.ToBoolean(LdcnGetStat(pico_addr) & 
Convert.ToBoolean(MOTOR_MOVING); 

나에게 오류를 제공하지 않습니다,하지만이 0 적이 없기 때문에 난 그냥 값을 테스트하는 경우 LdcnGetStat (pico_addr)는 항상 "true"를 반환 할 것 LdcnGetStat() 옷을 사는 모터가 움직이지 않을 때 28을 반환하고 움직일 때 98을 반환합니다. 이동 후 다시 테스트하면 23을 반환합니다.

C#에서이 문제를 해결할 적절한 방법이 있습니까? LdcnGetStat 올바른 숫자 값을 반환하는지 확인하려면 생각하고있어, 그 값을 처리 할 수있는 올바른 방법처럼 보이지 않는, 특히 이후 값을 이동 후 변경하려면 것 같습니다.

감사합니다.

답변

2

조건부는 0에 대한 비교를 효과적으로 컴파일합니다. 따라서 표현식 LdcnGetStat(pico_addr) & MOTOR_MOVING(LdcnGetStat(pico_addr) & MOTOR_MOVING) != 0과 같습니다. 그러나 C#에서는 조건문이 실제 bool 초로 완료되므로 두 번째 표현식 만 사용할 수 있습니다.

내가 필요한 경우 더 설명 할 수 있습니다.

bool isMoving = (LdcnGetStat(pico_addr) & MOTOR_MOVING) != 0; 

표현 :

byte isMoving = LdcnGetStat(pico_addr) & MOTOR_MOVING; 

가 아마 암시 적으로 byteint를 변환하는 방법에 대한 당신에게 오류를 제공

1

나는 당신을 위해 무엇을 찾고있는 것이라고 생각합니다. 당신은 그것을 캐스팅해야 : 모터가 이동 될 때 경우

byte isMoving = (byte)(LdcnGetStat(pico_addr) & MOTOR_MOVING); 

isMoving0x01에 동일 해집니다.

+0

'&'연산자가 결과 타입을 피연산자 중 더 길다고 가정하는 것처럼 보입니다. * 피연산자 중 * *가 부호없는 유형에 적합하면 결과가 해당 유형에 맞지 않을 수 있습니다. '|'연산자는 일반적으로 결과 타입을 피연산자 중 더 긴 것으로 가정해야하지만, 그 중 하나가 음의 상수이면 예외가 발생합니다 (이 경우 결과는 해당 상수를 보유 할 수있는 모든 유형에 맞도록 보장됩니다). – supercat

+0

BTW, 나는 또한 C#이 두 개의 정수 값 중 "비트와"가 0이 아닌지 테스트 할 int 형과 enum 형에 정의 된 편리한 연산자 또는 메소드를 갖고 싶습니다. C에서는'if (myFlags & THIS_FLAG) do_something();'이라고 말하고 싶습니다. 나는 그것을 (if ((myFlags & THIS_FLAG)! = 0) do_something();과 같이 쓰지 않아도 읽기 쉬움이 향상된다고 생각합니다. – supercat

+0

@supercat : 실제로 'byte'에있는 비트 연산자와 짝수 산술 연산자는 'Int32'를 반환합니다. 예를 들어'b3 = b1 & b2;'은'b1'과'b2'가'byte'로 선언 되더라도 에러를 발생시킵니다. 'byte b3 = b1 + b2'는 같은 에러를 줄 것이다. 다른 문제는 양면성입니다. 아마도 C#을하기 전에 파스칼에서 많은 작업을했기 때문일 것입니다. –