【问题标题】:How to reverse a combined flags result to flags?如何将组合标志结果反转为标志?
【发布时间】:2020-03-31 21:27:39
【问题描述】:

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

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

  1. 3ds MAX 版本号
  2. 3ds Max SDK 当前版本号
  3. 针对给定 API 的 SDK 3ds Max 修订版

这是结果和最终值:

#define VERSION_3DSMAX ((MAX_RELEASE<<16)+(MAX_API_NUM<<8)+MAX_SDK_REV)

这是定义:

#define MAX_RELEASE      MAX_RELEASE_R22    /// Value of MAX_RELEASE_R22 is 22000
#define MAX_API_NUM      MAX_API_NUM_R220   /// Value of MAX_API_NUM_R220 is 55
#define MAX_SDK_REV                 0 

现在在 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

现在,我的问题是如何反转结果值 [a number] 以获取这些标志? 有什么办法吗?

【问题讨论】:

    标签: c++ 3dsmax


    【解决方案1】:

    要获取unsigned inm 位,请执行以下操作:

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

    (也许我差了一个,但大致如此)。您首先将数字n 向右移动,这将删除n-th 右侧的所有字节。然后你必须剪掉你想要的数字之上的所有数字,现在是n-m-th,为此你需要用 2^(n-m) 取模。

    【讨论】:

      【解决方案2】:

      在宏的形式下,逆变换是:

      #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)
      

      您可以轻松地将它们转换为函数。

      Demo

      【讨论】:

      • 太棒了!现在我明白为什么我必须学习数学而不是学习法律:(
      • 应该是#define MAX_API_NUM_V ((VERSION_3DSMAX &amp; 0xFF) &gt;&gt; 8)
      【解决方案3】:
      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-22
        • 2018-09-30
        • 1970-01-01
        • 2010-11-23
        • 2018-02-10
        • 2013-06-07
        相关资源
        最近更新 更多