C - 为什么用&而不是switch/if来比较常量?

Tia*_*ago 0 c comparison switch-statement ampersand opensl

我正在阅读Android的OpenSL文档.引用以下文档:http://mobilepearls.com/labs/native-android-api/ndk/docs/opensles/

"应该准备好或多或少地调用回调处理程序,以接收其他事件类型,并且应该忽略它们无法识别的事件类型.应该准备使用已启用事件类型的事件掩码配置的回调多个事件类型位同时设置.使用"&"测试每个事件位而不是开关盒. "

检查OpenSL的官方规范(https://www.khronos.org/registry/sles/specs/OpenSL_ES_Specification_1.0.1.pdf),我感兴趣的是这3个常量:

SL_PREFETCHSTATUS 

#define SL_PREFETCHSTATUS_UNDERFLOW          ((SLuint32) 0x00000001) 
#define SL_PREFETCHSTATUS_SUFFICIENTDATA     ((SLuint32) 0x00000002) 
#define SL_PREFETCHSTATUS_OVERFLOW           ((SLuint32) 0x00000003)
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,上面的引用说要使用&进行比较,如下所示:

if(status & SL_PREFETCHSTATUS_UNDERFLOW) doSomething_1();
if(status & SL_PREFETCHSTATUS_SUFFICIENTDATA) doSomething_2();
if(status & SL_PREFETCHSTATUS_OVERFLOW) doSomething_3();
Run Code Online (Sandbox Code Playgroud)

而不是开关案例:

switch(statusCode){

    case(SL_PREFETCHSTATUS_UNDERFLOW): doSomething_1(); break;
    case(SL_PREFETCHSTATUS_SUFFICIENTDATA): doSomething_2(); break;
    case(SL_PREFETCHSTATUS_OVERFLOW): doSomething_3(); break;
}
Run Code Online (Sandbox Code Playgroud)

现在,我不明白为什么会这样.任何人都可以解释我的原因吗?

PS:如果常量定义为2的倍数,就像这样:

#define SL_PREFETCHSTATUS_UNDERFLOW          ((SLuint32) 0x00000001) 
#define SL_PREFETCHSTATUS_SUFFICIENTDATA     ((SLuint32) 0x00000002) 
#define SL_PREFETCHSTATUS_OVERFLOW           ((SLuint32) 0x00000004)
Run Code Online (Sandbox Code Playgroud)

这是有道理的,但规范将最后一个常量定义为0x00000003而不是0x00000004,所以我输了.

kic*_*ken 5

该注释是关于事件常量的.你所看到的不是事件常量,而是状态常量.事件常量将是例如:

#define SL_PLAYEVENT_HEADATEND ((SLuint32) 0x00000001)
#define SL_PLAYEVENT_HEADATMARKER ((SLuint32) 0x00000002)
#define SL_PLAYEVENT_HEADATNEWPOS ((SLuint32) 0x00000004)
#define SL_PLAYEVENT_HEADMOVING ((SLuint32) 0x00000008)
#define SL_PLAYEVENT_HEADSTALLED ((SLuint32) 0x00000010)
Run Code Online (Sandbox Code Playgroud)

您可以看到这些是位掩码值,可以组合使用.由于它们可以组合,因此您需要比较各个位而不是整个值,以确保您正确匹配您感兴趣的事件.