C++ 如何将组合标志结果反转为标志?

C++ 如何将组合标志结果反转为标志?,c++,3dsmax,C++,3dsmax,我正在开发一个3ds max简单插件。有一个函数返回一个名为“MAX_Version”的标志 它是3个类似枚举的标志的组合 3ds MAX版本号 3ds Max SDK当前版本号 给定API的SDK的3ds Max修订版 以下是结果和最终值: #define VERSION_3DSMAX ((MAX_RELEASE<<16)+(MAX_API_NUM<<8)+MAX_SDK_REV) 现在,3ds max SDK标题中定义了很多: //! 3ds Max R18 (20

我正在开发一个3ds max简单插件。有一个函数返回一个名为“MAX_Version”的标志

它是3个类似枚举的标志的组合

  • 3ds MAX版本号
  • 3ds Max SDK当前版本号
  • 给定API的SDK的3ds Max修订版
  • 以下是结果和最终值:

    #define VERSION_3DSMAX ((MAX_RELEASE<<16)+(MAX_API_NUM<<8)+MAX_SDK_REV)
    
    现在,3ds max SDK标题中定义了很多:

    //! 3ds Max R18 (2016) Preview release id
    #define MAX_RELEASE_R18_PREVIEW     17900
    //! 3ds Max R18 (2016) release id
    #define MAX_RELEASE_R18     18000
    //! 3ds Max R19 (2017) Preview release id
    #define MAX_RELEASE_R19_PREVIEW     18900
    //! 3ds Max R19 (2017) release id
    #define MAX_RELEASE_R19     19000
    //! 3ds Max R20 (2018) Preview release id
    #define MAX_RELEASE_R20_PREVIEW     19900
    //! 3ds Max R20 (2018) release id
    #define MAX_RELEASE_R20     20000
    //! 3ds Max R21 (2019) Preview release id
    #define MAX_RELEASE_R21_PREVIEW     20900
    //! 3ds Max R21 (2019) Preview 2 (ShapeObject revisions)
    #define MAX_RELEASE_R21_PREVIEW2    20901
    //! 3ds Max R21 (2019) release id
    #define MAX_RELEASE_R21     21000
    //! 3ds Max R22 (2020) Preview release id
    #define MAX_RELEASE_R22_PREVIEW     21900
    //! 3ds Max R22 (2020) release id
    #define MAX_RELEASE_R22             22000
    
    现在,我的问题是如何反转结果值[一个数字]以获得这些标志?
    有什么办法吗?

    要获取
    无符号i
    n
    m
    位,请执行以下操作:

    (i>>n)%(1 << (m-n));
    

    (i>>n)%(1以宏的形式,逆变换为:

    #define MAX_SDK_REV_V (VERSION_3DSMAX & 0xFF)
    #define MAX_API_NUM_V ((VERSION_3DSMAX >> 8) & 0xFF)
    #define MAX_RELEASE_V ((VERSION_3DSMAX >> 16) & 0xFFFF)
    
    您可以轻松地将它们转换为函数


    太棒了!现在我明白了为什么我必须学习数学而不是学习法律:(应该是
    \define MAX\u API\u NUM\u V((VERSION\u 3DSMAX&0xFF)>>8)
    #define MAX_SDK_REV_V (VERSION_3DSMAX & 0xFF)
    #define MAX_API_NUM_V ((VERSION_3DSMAX >> 8) & 0xFF)
    #define MAX_RELEASE_V ((VERSION_3DSMAX >> 16) & 0xFFFF)
    
    int flag = MAX_RELEASE_R18_PREVIEW; // 17900
    
    // MAX_SDK_REV
    int a = (flag & 0xff); // 236
    
    // MAX_API_NUM
    int b = (flag & 0xff00) >> 8; // 69
    
    // MAX_RELEASE
    int c = (flag & 0xff0000) >> 16; // 0