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