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是否返回了正确的数值,但这似乎不是正确的处理方式,尤其是因为移动后值似乎会发生变化。

感谢

C#中的位操作

C/C++中的条件有效地编译为与零的比较。因此表达式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