UE4中的位掩碼(Bitmask)的介紹和使用
簡介
環境:UE 4.25
位掩碼(Bitmask)
位掩碼是一串二進位制數(比如子網掩碼),每一位是一個Flag,表示一種狀態,一個32位的位掩碼就可以表示32種狀態的組合。如果期望使用多個bool變數共同作用與同一個地方,就可以使用位掩碼來實現。
- 使用位掩碼是為了控制一組bool變數,用一個變數就可以表示豐富的狀態。
- 使用列舉是為了給每個Flag命名,增強可讀性。
位操作
由於位掩碼是使用二進位制來表示一個Flag,所以最常使用的操作就是位運算:與(&)、非(~)、或(|)、異或(^)、左移(<<)和右移(>>)。
藍圖位掩碼
藍圖建立位掩碼可檢視官方教程
建立位掩碼
總結一下過程可分為3步:
-
建立一個藍圖列舉,並將Bitmask Flags設為true
-
在藍圖中建立一個整型變數,設定為Bitmask,最多支援32個Flags
-
使用它
其中常用的操作為:
• 隱式轉化為bool:判斷Bitmask中是否含有Flags。
• 按位非(Bitwise NOT):得到一個相反的Bitmask。
• 按位與(Bitwise AND):得到一個含有共同Flags的Bitmask。
• 按位或(Bitwise OR):得到一個含有所有Flags的Bitmask。
使用方式示例
• 開啟Flag:
• 關閉Flag:
• 判斷是否包含Flag:
C++位掩碼
在C++中使用位掩碼有更大的自由度。可以使用int32、int64、uint32等表示掩碼,而藍圖只支援int32。同時,表示Bitflags的列舉型別也可以使用uint32、uint64等,而藍圖只支援uint8。
Bitmask常用的操作(變數作為示範):
//int32 MyBitmask = 3;
//int32 MyFlag = 1;
MyBitmask |= MyFlag; //開啟Flag
MyBitmask &= ~MyFlag; //關閉Flag
if (MyBitmask & MyFlag) { /*Do something*/ }//判斷Flag是否開啟
方式一
可以利用左移操作設定列舉值,使得列舉變數對應的值與它的Bitmask的Flag值是一樣的。
UENUM(meta = (Bitflags))
enum class EMyTypeEnum :uint32
{
Type1 = (1 << 0),
Type2 = (1 << 1),
Type3 = (1 << 2),
Type4 = (1 << 3),
Type5 = (1 << 4),
Type6 = (1 << 5)
};
UPROPERTY(EditAnywhere, BlueprintReadWrite,meta = (Bitmask,BitmaskEnum = "EMyTypeEnum"))
int32 MyTypeBitmask;
判斷Bitmask中是否包含列舉對應的Flag(直接轉化即可得到Flag值):
if (MyTypeBitmask & static_cast<uint32>(EMyTypeEnum::Type2))
{
//Do something
}
方式二
如果需要同時在C++和藍圖中都獲得良好的體驗,則需要新增函式或巨集來獲得列舉對應正確的Bitmask值。
使用巨集從正常順序的列舉值得到Flag值:
#define TOFLAG(Enum) (1 << static_cast<uint8>(Enum))
藍圖和C++都可以使用該列舉作為Bitflags:
UENUM(BlueprintType, meta = (Bitflags))
enum class EMyTypeEnum :uint8
{
Type1, //= 0
Type2, //= 1
Type3, //= 2
Type4, //= 3
Type5, //= 4
Type6 //= 5
};
UPROPERTY(EditAnywhere, BlueprintReadWrite,meta = (Bitmask,BitmaskEnum = "EMyTypeEnum"))
int32 MyTypeBitmask;
判斷Bitmask中是否包含列舉對應的Flag(使用巨集得到Flag值)
if (MyTypeBitmask & TOFLAG(EMyTypeEnum::Type2))
{
//Do something
}
相關文章
- html中的錨點介紹和使用HTML
- langchain中的chat models介紹和使用LangChain
- MongoDB Oplog中的欄位介紹MongoDB
- LayerMask 的介紹和使用
- linux中的掩碼 umaskLinux
- delphi中Treeview的使用介紹View
- web worker的介紹和使用Web
- MT6169 PVT時間掩碼測試中的TPC事件定時和修改MIPI TX資料介紹事件
- 陣列-在Shell指令碼中的基本使用介紹陣列指令碼
- 原始碼管理工具——GitHub的介紹和使用原始碼Github
- hibernate 中 Criteria 的使用介紹
- Web Storage API的介紹和使用WebAPI
- 十六進位制在正規表示式中的使用簡單介紹
- JS中setInterval和setTimeout使用介紹JS
- React中10種Hook的使用介紹ReactHook
- ios中Runtime的介紹以及使用iOS
- MySQL使用XtraBackup的shell指令碼介紹MySql指令碼
- Google guava工具類的介紹和使用GoGuava
- Redis介紹和使用Redis
- Nacos使用和註冊部分原始碼介紹原始碼
- 簡單介紹 IP,子網掩碼,DNS(一道華為面試題)DNS面試題
- 介紹 Linux 中的管道和命名管道Linux
- JVM中記憶體和GC的介紹JVM記憶體GC
- Hanlp在ubuntu中的使用方法介紹HanLPUbuntu
- Hbase原理的介紹和使用場景分析
- redis的簡單使用和介紹(轉載)Redis
- ccs的介紹,安裝和使用入門
- ddddocr基本使用和介紹
- 有廣州的php坑位介紹嗎?PHP
- Kafka中的segment的介紹Kafka
- JVM中堆的介紹JVM
- angular中的全域性方法和指令介紹1Angular
- Hanlp在java中文分詞中的使用介紹HanLPJava中文分詞
- js中匿名函式的使用簡單介紹JS函式
- layui 的基本使用介紹UI
- JQuery的介紹與使用jQuery
- LangChain的Agent使用介紹LangChain
- certutil工具的使用介紹