首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

位運算實現多選過濾優化:以 C# 列舉旗標模式為例

     編輯:Java 相關知識

業務場景:固定選項的多重過濾

訊息類型固定為 6 種,使用者可任意組合勾選。傳統 SQL 拼接或雙重迴圈判斷代碼複雜且效能差。位運算提供 O(1) 判斷方案。

核心原理:二進制位旗標

將每個選項映射為 2 的冪次(二進制單一位為 1):

public enum CategoryType : int {
    Unknown = 1,      // 0000 0001
    Critical = 2,     // 0000 0010
    Error = 4,        // 0000 0100
    Warning = 8,      // 0001 0000
    Information = 16, // 0010 0000
    Verbose = 32,     // 0100 0000
    Other = 1024      // 1000 0000 0000
}

客戶端:位或運算組合選項

var category = 0;
if (ckType2Checked()) category |= 2;    // Critical
if (ckType4Checked()) category |= 4;    // Error
if (ckType8Checked()) category |= 8;    // Warning
// ... 等同於 category = 2 + 4 + 8 = 13 (0000 1101)

傳給伺服器的只是單一整數 13,對應的組合唯一(數學可證)。

伺服器端:位與運算快速判斷

foreach (var item in list) {
    if (((int)item.Category & categoryFilter) > 0 
        && ((int)item.Direction & directionFilter) > 0) {
        yield return item;
    }
}
  • item.Category & filter > 0 表示該類型被選中
  • 全選時設 filter = 0x7FFFFFFF (全 1)

客戶端回填:同樣用位與判斷

ckType2Checked((category & 2) > 0);
ckType4Checked((category & 4) > 0);
// ...

適用性與限制

場景是否適合說明
固定、較少選項 (≤32/64)✅ 極佳單一 int/long 即可,效能最高
選項不固定/動態❌ 不適合需維護映射表,反而複雜
選項極多 (成千上萬)⚠️ 可行但罕見可用整數陣列/位圖,但 UI 不會這樣設計

維護成本提示

新增/修改選項需同步更新伺服端 enum 與客戶端控件,但修改範圍小、風險可控。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved