C#中的位操作
本文关键字:位操作 | 更新日期: 2023-09-27 18:22:13
我是一名为学院化学系做项目的学生。去年,我写了一个C++程序来控制一个微微电机平台,并让它与力压力传感器通信,上下移动平台,直到它接触到传感器。我使用了该公司提供的DLL来编写这个程序。我花了一段时间,但我把一切都做好了。
今年,我将在程序中加入第二个阶段,并使用C#将整个程序更新到GUI中。第二阶段和力传感器只提供与C#一起工作的DLL,而旧阶段是为C++设计的。我能够让这三个都在新的C#GUI程序中工作,除了这个问题,一切都差不多完成了:
在旧程序中,我能够通过以下功能确定舞台上的电机是否在移动:
#define MOTOR_MOVING 0x01
byte isMoving = LdcnGetStat(pico_addr) & MOTOR_MOVING;
字节LdcnGetStat(字节地址)返回模块在给定地址的最后一个状态字节。根据我的指导手册,假设在电机移动时设置位0。因此,如果我在C++程序中使用bool变量测试它,当电机不移动时,isMoving为0,当电机移动时为1,当电机停止移动后,它会立即返回0。工作良好。
但在C#中,我在整合这一点时遇到了问题。
byte isMoving = LdcnGetStat(pico_addr) & MOTOR_MOVING;
不起作用,我必须做一些明确的选角。所以我把它改成了这个:
bool isMoving = Convert.ToBoolean(LdcnGetStat(pico_addr) &
Convert.ToBoolean(MOTOR_MOVING);
这并没有给我一个错误,但LdcnGetStat(pico_addr)将始终返回"true",因为它从来都不是0。如果我只是测试LdcnGetStat()输出的值,当电机不移动时,它返回28,当它移动时,返回98。如果我在移动后再次测试,它将返回23。
在C#中有合适的方法来处理这个问题吗?我想检查LdcnGetStat是否返回了正确的数值,但这似乎不是正确的处理方式,尤其是因为移动后值似乎会发生变化。
感谢
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;
可能会在将int
隐式转换为byte
时出错。你必须投它:
byte isMoving = (byte)(LdcnGetStat(pico_addr) & MOTOR_MOVING);
在这种情况下,当电机移动时,isMoving
将等于0x01
。