gcc (GCC) 4.8.2
c89你好,
掩蔽位运算符:
我想掩盖以下几点:
SIGNAL_ID_EVENT_DTMF_1 | SIGNAL_ID_EVENT_DTMF_STAR | SIGNAL_ID_EVENT_DTMF_POUND我使用以下函数设置了上面的内容:
static void g_convert2_ipm_digits(unsigned short *terminator)
{
*terminator = SIGNAL_ID_EVENT_DTMF_1 | SIGNAL_ID_EVENT_DTMF_STAR | SIGNAL_ID_EVENT_DTMF_POUND;
}因此,当一个数字出现在I&(和)中时,它会查看模式是否存在:
static apk_bool_t g_check_term_digit(unsigned short terminators, unsigned short digit)
{
if(terminators & digit) {
return TRUE;
}
return FALSE
}然而,不管函数是什么数字,它总是返回true。只有那些我戴着面具的人才能返回真实。
当我在上面的函数中检查调试器时,我得到以下函数。但是,这不应该返回true,因为按下的数字是5。
(gdb) p terminators
$22 = 11
(gdb) p digit
$23 = 5我期望的数字在下面的枚举中定义:
typedef enum
{
SIGNAL_ID_EVENT_DTMF_0 = 0x0,
SIGNAL_ID_EVENT_DTMF_1 = 0x1,
SIGNAL_ID_EVENT_DTMF_2 = 0x2,
SIGNAL_ID_EVENT_DTMF_3 = 0x3,
SIGNAL_ID_EVENT_DTMF_4 = 0x4,
SIGNAL_ID_EVENT_DTMF_5 = 0x5,
SIGNAL_ID_EVENT_DTMF_6 = 0x6,
SIGNAL_ID_EVENT_DTMF_7 = 0x7,
SIGNAL_ID_EVENT_DTMF_8 = 0x8,
SIGNAL_ID_EVENT_DTMF_9 = 0x9,
SIGNAL_ID_EVENT_DTMF_STAR = 0xa,
SIGNAL_ID_EVENT_DTMF_POUND = 0xb,
SIGNAL_ID_EVENT_DTMF_A = 0xc,
SIGNAL_ID_EVENT_DTMF_B = 0xd,
SIGNAL_ID_EVENT_DTMF_C = 0xe,
SIGNAL_ID_EVENT_DTMF_D = 0xf,
}非常感谢你的建议,
发布于 2014-01-28 09:30:27
您需要使用两个值:例如
SIGNAL_ID_EVENT_DTMF_0 = 0x01,
SIGNAL_ID_EVENT_DTMF_1 = 0x02,
SIGNAL_ID_EVENT_DTMF_2 = 0x04,
SIGNAL_ID_EVENT_DTMF_3 = 0x08,
SIGNAL_ID_EVENT_DTMF_4 = 0x10,因为在应用逻辑或操作时,您要将数字位图合并在一起:
R = SIGNAL_ID_EVENT_DTMF_1 | SIGNAL_ID_EVENT_DTMF_3 | SIGNAL_ID_EVENT_DTMF_4等于(二进制):
R = 00010 | 01000 | 10000 => 11010因此,稍后您可以使用&操作来查看某个特定值是否为真:
R & SIGNAL_ID_EVENT_DTMF_3 => true因为
11010 & 01000 => 01000 != 0 => true发布于 2014-01-28 09:30:52
例如,SIGNAL_ID_EVENT_DTMF_3的值有两个位集。零和一位。你所做的并不是像你所期望的那样制造一个比特掩码。似乎您也应该使用位移位:
*terminator = (1 << SIGNAL_ID_EVENT_DTMF_1) |
(1 << SIGNAL_ID_EVENT_DTMF_STAR) |
(1 << SIGNAL_ID_EVENT_DTMF_POUND);然后在掩蔽时对digit做同样的处理:
if (terminators & (1 << digit)) { ... }https://stackoverflow.com/questions/21401560
复制相似问题