C#中的按位运算

时间:2013-07-12 20:17:22

标签: c# byte bit-manipulation

我是一名学生正在为我的大学化学系工作。去年我编写了一个C ++程序来控制微动机阶段并让它与力压力传感器通信,上下移动平台直到它接触到传感器。我使用公司提供的DLL来编写这个程序。我花了一段时间,但我得到了一切工作。

今年,我将第二阶段纳入该计划,并使用C#将整个程序更新为GUI。第二阶段和力传感器仅提供与C#一起使用的DLL,而旧阶段则用于C ++。我能够让所有三个人都在新的C#GUI程序中工作,这几乎完成了所有这一切:

在旧程序中,我能够确定舞台上的电机是否通过此功能移动:

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

byte LdcnGetStat(byte address)返回给定地址处模块的最后一个状态字节。根据我的说明书,假设在电机运行时设置位0。所以,如果我在我的C ++程序中测试它,使用bool变量,当电机不运动时isMoving为0,当它们运动时isMoving为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是否返回正确的数值,但这似乎不是处理它的正确方法,特别是因为值似乎在移动后会发生变化。

由于

2 个答案:

答案 0 :(得分:2)

C / C ++中的条件有效地编译为零比较。因此,LdcnGetStat(pico_addr) & MOTOR_MOVING表达式等同于(LdcnGetStat(pico_addr) & MOTOR_MOVING) != 0。但是在C#中,条件语使用实际的bool来完成,所以你只能使用第二个表达式。

如果你需要我,我可以解释更多。

答案 1 :(得分:1)

我认为您正在寻找的是:

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