C# C语言中的位运算#

C# C语言中的位运算#,c#,byte,bit-manipulation,C#,Byte,Bit Manipulation,我是一名学生,在我学院化学系做一个项目。去年我编写了一个C++程序来控制微微运动阶段并使它与一个力-压力传感器通信,使平台上下移动直到它接触到传感器。我使用公司提供的DLL来编写这个程序。这花了我一段时间,但我把一切都安排好了 今年,我将在程序中加入第二个阶段,并使用C#将整个程序更新到GUI中。第二阶段和力传感器只提供与C *工作的DLL,而旧阶段则是C++的。我能够在新的C#GUI程序中让这三个都工作,这一切几乎都完成了,解决了这个问题: 在旧程序中,我能够通过此功能确定舞台上的电机是否在移

我是一名学生,在我学院化学系做一个项目。去年我编写了一个C++程序来控制微微运动阶段并使它与一个力-压力传感器通信,使平台上下移动直到它接触到传感器。我使用公司提供的DLL来编写这个程序。这花了我一段时间,但我把一切都安排好了

今年,我将在程序中加入第二个阶段,并使用C#将整个程序更新到GUI中。第二阶段和力传感器只提供与C *工作的DLL,而旧阶段则是C++的。我能够在新的C#GUI程序中让这三个都工作,这一切几乎都完成了,解决了这个问题:

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

#define MOTOR_MOVING 0x01
byte isMoving = LdcnGetStat(pico_addr) & MOTOR_MOVING;
字节LdcnGetStat(字节地址)返回给定地址处模块的最后一个状态字节。根据我的指导手册,假设在电机移动时设置位0。因此,如果我在C++程序中使用布尔变量来测试,当电机不移动时ISISON为0,当它们不运动时为1,马达停止运动后,ISFEEP立即返回到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++中的条件语句有效地编译为与零的比较。因此表达式
LdcnGetStat(pico_addr)&MOTOR_MOVING
相当于
(LdcnGetStat(pico_addr)&MOTOR_MOVING)!=0
。然而,在C#中,条件句是用实际的
bool
s完成的,因此只能使用第二个表达式


如果需要的话,我可以解释得更多。

C/C++中的条件语句有效地编译为与零的比较。因此表达式
LdcnGetStat(pico_addr)&MOTOR_MOVING
相当于
(LdcnGetStat(pico_addr)&MOTOR_MOVING)!=0
。然而,在C#中,条件句是用实际的
bool
s完成的,因此只能使用第二个表达式


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

我想您需要的是:

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

我想您需要的是:

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

我真的很讨厌
&
运算符似乎假定结果类型是其操作数中较长的一个。如果任意一个操作数适合无符号类型,则结果不可能不适合该类型。
|
运算符通常应假定结果类型为其操作数中较长的一个,但如果其中一个操作数为负常量(在这种情况下,结果保证适合任何可以保持该常量的类型),则可能会有例外。顺便说一句,我还真希望C#能在
int
enum
类型上定义一个方便的运算符或方法,用于测试两个整数值的“按位and”是否为非零。在C语言中,我会说
if(myFlags&THIS_FLAG)do_something()。我不认为必须把它写得好像((myFlags&THIS_FLAG)!=0)做了什么事()特别提高了易读性。@supercat:实际上,
byte
上的按位和偶数算术运算符返回
Int32
。例如,
字节b3=b1&b2b1
b2
声明为
byte
,code>也会给出错误<代码>字节b3=b1+b2将给出相同的错误。在另一个问题上,我很矛盾。可能是因为我在C#之前用Pascal做了很多工作。我觉得要求字节1=byte2和byte3的转换范围缩小很讨厌。我还真的不喜欢
float
double
的转换正在扩大,但以另一种方式进行的转换却不是这样。如果有什么不同的话,
double
float
的转换应该是更广泛的转换,因为将
int64
转换为
double
,然后再转换为
float
将产生最接近原始值的
float
值,或者产生两个基本相同的值之一。转换为
浮点
可能会导致不同的值变得不可区分,但保持不同的值……将根据直接转换为
浮点
int64
值正确排序。相比之下,将
int64
值转换为
float
,然后再转换为
double
,只需要“加宽”转换,但大多数生成的
double
值都是错误的。此外,给定
double d=UInt64.MaxValue;浮动f=UInt64.MaxValue
,哪个更大,
f*f
Math.Pow(d,15)
?对于正确的数学值,每个表达式将在其类型中产生最佳表示。哪个更正确?比较为float还是double?我真的很恼火,
&
操作符似乎认为结果类型更长