如何将组合标志结果反转为标志?
How to reverse a combined flags result to flags?
我正在开发一个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)
以下是定义:
#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
现在,我的问题是我如何反转结果值[一个数字]来获取这些标志? 有什么办法可以做到吗?
在宏的形式中,逆变换是:
#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)
您可以轻松地将它们转换为函数。
演示
要获取n
m
unsigned i
的位,请执行以下操作:
(i>>n)%(1 << (m-n));
(也许我差一个,但大致如此(。您将数字首先向右移动n
,这将删除n
-th 右侧的所有字节。然后你必须切断你想要的数字上面的所有数字,现在是n-m
-th,为此你需要用2^(n-m(来取模。
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
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 即使使用调试编译标志,表达式也是"optimized out"
- 如何将组合标志结果反转为标志?
- 为什么std::istringstream在没有引发故障位标志的情况下生成错误的结果
- BOOST_CHECK_EQUAL标志的结果c++