首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >掩蔽位运算符

掩蔽位运算符
EN

Stack Overflow用户
提问于 2014-01-28 09:25:27
回答 2查看 107关注 0票数 0
代码语言:javascript
运行
复制
gcc (GCC) 4.8.2
c89

你好,

掩蔽位运算符:

我想掩盖以下几点:

代码语言:javascript
运行
复制
SIGNAL_ID_EVENT_DTMF_1 | SIGNAL_ID_EVENT_DTMF_STAR | SIGNAL_ID_EVENT_DTMF_POUND

我使用以下函数设置了上面的内容:

代码语言:javascript
运行
复制
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&(和)中时,它会查看模式是否存在:

代码语言:javascript
运行
复制
static apk_bool_t g_check_term_digit(unsigned short terminators, unsigned short digit)
{
    if(terminators & digit) {
        return TRUE;
    }
    return FALSE
}

然而,不管函数是什么数字,它总是返回true。只有那些我戴着面具的人才能返回真实。

当我在上面的函数中检查调试器时,我得到以下函数。但是,这不应该返回true,因为按下的数字是5。

代码语言:javascript
运行
复制
(gdb) p terminators
$22 = 11
(gdb) p digit
$23 = 5

我期望的数字在下面的枚举中定义:

代码语言:javascript
运行
复制
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,
}

非常感谢你的建议,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-28 09:30:27

您需要使用两个值:例如

代码语言:javascript
运行
复制
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,

因为在应用逻辑或操作时,您要将数字位图合并在一起:

代码语言:javascript
运行
复制
R = SIGNAL_ID_EVENT_DTMF_1 | SIGNAL_ID_EVENT_DTMF_3 | SIGNAL_ID_EVENT_DTMF_4

等于(二进制):

代码语言:javascript
运行
复制
R = 00010 | 01000 | 10000 => 11010

因此,稍后您可以使用&操作来查看某个特定值是否为真:

代码语言:javascript
运行
复制
R & SIGNAL_ID_EVENT_DTMF_3 => true

因为

代码语言:javascript
运行
复制
11010 & 01000 => 01000 != 0 => true
票数 5
EN

Stack Overflow用户

发布于 2014-01-28 09:30:52

例如,SIGNAL_ID_EVENT_DTMF_3的值有两个位集。零和一位。你所做的并不是像你所期望的那样制造一个比特掩码。似乎您也应该使用位移位:

代码语言:javascript
运行
复制
*terminator = (1 << SIGNAL_ID_EVENT_DTMF_1) |
              (1 << SIGNAL_ID_EVENT_DTMF_STAR) |
              (1 << SIGNAL_ID_EVENT_DTMF_POUND);

然后在掩蔽时对digit做同样的处理:

代码语言:javascript
运行
复制
if (terminators & (1 << digit)) { ... }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21401560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档