微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C ++中的“变量|变量”是什么意思?

如何解决C ++中的“变量|变量”是什么意思?

| 看到以下内容时,我正在研究此ITE8712看门狗定时器演示代码
void InitWD(char cSetWatchDogUnit,char cSetTriggerSignal)
{
OpenIoConfig();     //open super IO of configuration for Super I/O

SelectIoDevice(0x07);   //select device7

//set watch dog counter of unit
WriteIoCR(0x72,cSetWatchDogUnit|cSetTriggerSignal);

//CloseIoConfig();      //close super IO of configuration for Super I/O
}
而且,我想知道这行是什么意思:
cSetWatchDogUnit|cSetTriggerSignal
因为WriteIoCR函数看起来像这样:
void WriteIoCR(char cIndex,char cData)
{
//super IO of index port for Super I/O
//select super IO of index register for Super I/O
outportb(equIndexPort,cIndex);

//super IO of data for Super I/O
//write data to data register
outportb(equDataPort,cData);
}
所以cIndex应该是0x72,但是cData呢?我真的没有得到\“ | \”,因为我只在条件语句中将它用于OR(\“ || \”)。     

解决方法

它是按位
or
,与常规逻辑
or
不同。如果设置了两个源变量中的任何一个的相应位,则基本上设置目标变量中的位。 例如,表达式“ 5”可以计算为:
43 = 0x2b = binary 0010 1011
17 = 0x11 = binary 0001 0001
                   ==== ====
        \"or\" them: 0011 1011 = 0x3b = 59
请参阅此答案,以更全面地检查各种按位运算符。 当您要操纵数据类型中的特定位(例如,控制嵌入式系统中的看门狗计时器(您的特定用例))时,通常使用它。 您可以使用
or (|)
打开位,并使用
and (&)
关闭位(使用用于打开位的位掩码的反转)。 因此,要打开
b3
位,请使用:
val = val | 0x08; // 0000 1000
要关闭它,请使用:
val = val & 0xf7; // 1111 0111
要检测当前是否设置了“ 9”,请使用:
if ((val & 0x08) != 0) {
    // it is set.
}
通常,您会看到定义的位掩码类似:
#define B0 0x01
#define B1 0x02
#define B2 0x04
#define B3 0x08
#define B4 0x10
要么:
enum BitMask {
    B0 = 0x01,B1 = 0x02,B2 = 0x04,B3 = 0x08,B4 = 0x10
};
关于这意味着什么:
WriteIoCR (0x72,cSetWatchDogUnit|cSetTriggerSignal);
0x72
将是您正在写入的某种I / O端口,
cSetWatchDogUnit
cSetTriggerSignal
将是位掩码,您可以将它们组合起来以输出命令(设置触发信号并为看门狗使用单位值) 。该命令在实践中的含义可以推断出来,但是您更安全地参考看门狗电路本身的文档。 而且,如果您不知道看门狗电路是干什么的,那这是一个简单的电路,如果您不经常踢它(使用另一个命令),它将重置您的系统,可能是通过激活正在使用的任何处理器上的重置引脚来实现的。 这是一种自动检测行为不佳的软件并使设备返回到已知初始状态的方法,可以遵循这样的理论:重新启动比继续执行错误的状态更好。     ,那是按位或。 在这里用于组合标志。     ,
x | y
通常与C / C ++中的Plain Old Datas一起使用。这意味着按位或。 例如
char x = 0x1,y = 0x2;
x | y ==> 0x3
[注:根据您的需要,
operator |
可以重载for23ѭ。]     ,
|
是按位或。如果任一整数中的一个或另一个相同的位为ON,则将位切换为(1而不是0)。
||
是逻辑或。如果一个或另一个为true,则返回true。     ,好的,这就是为什么在这种情况下使用按位运算,或看到它们已被使用的原因。 通常,这些变量是用于将多个数据打包到一个字符中的标志 如果
cSetWatchDogUnit
并且
cSetTriggerSignal
具有不重叠的位(例如
cSetWatchDogUnit = 1 << 0
cSetTriggerSignal = 1 << 1
,您可以稍后检查是否按位设置它们,例如以下虚构示例:
if cData & cSetWatchDogUnit
    do something
if cData & cSetTriggerSignal
    do something else
在整个过程中,这两个标志都可以打包并在单个char中传递。这样,您最终就不会传递布尔数组,可以添加新的常量
cSetSomeOtherDamnfoolThing = 1 << 2
,并且可以在代码中将标志称为变量。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。