例如,我有 3 个计数器(我基本上想将其表示为真值(计数器 > 0 为真;否则为假)。这导致我的真值有 2^3 = 8 个排列,如下所示:
000 001 010 011 100 101 110 111
然后每个排列映射到一个状态。如何将这些计数器转换为位级别的二进制表示,然后如何使用开关结构中的二进制表示映射到状态?(例如,001 映射到“包含 x”和 010 映射到“包含 y”,而 011 将映射到“包含 x 和 y”。这一切都可以移植到其他操作系统吗?
例如,我有 3 个计数器(我基本上想将其表示为真值(计数器 > 0 为真;否则为假)。这导致我的真值有 2^3 = 8 个排列,如下所示:
000 001 010 011 100 101 110 111
然后每个排列映射到一个状态。如何将这些计数器转换为位级别的二进制表示,然后如何使用开关结构中的二进制表示映射到状态?(例如,001 映射到“包含 x”和 010 映射到“包含 y”,而 011 将映射到“包含 x 和 y”。这一切都可以移植到其他操作系统吗?
一种可能性是使用对应于每个计数器的每个位的值来定义常量:
#define CTR1_BIT 0x01
#define CTR2_BIT 0x02
#define CTR3_BIT 0x04
然后根据计数器值(零或非零)设置位。|
运算符执行按位逻辑 OR 运算(有关更多信息,请参阅此内容)。如果ctr1
是非零,它只是设置变量中的最低位state
。如果ctr2
为非零,则将第二位设置state
为 1,其他位保持不变。等等
int state = 0;
if ( ctr1 )
state |= CTR1_BIT;
if ( ctr2 )
state |= CTR2_BIT;
if ( ctr3 )
state |= CTR3_BIT;
然后打开可能的状态值:
switch ( state )
{
case 0x00:
printf( "state 0\n" );
break;
case 0x01:
printf( "state 1\n" );
break;
case 0x02:
...
case 0x07:
printf( "state 7\n" );
break;
default:
printf( "Invalid state\n" );
assert(0);
}