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

C# 位運算技巧:用 | 組合、& 拆分標誌位枚舉

     編輯:關於C#

場景

權限系統:用戶可能同時擁有多個權限。若為每種組合定義新類型(如 AB、ABC、BC),組合爆炸難以維護。

標準解法:位標誌枚舉

[Flags]
public enum Privilege {
    Read   = 0x01,  // 0001
    Write  = 0x02,  // 0010
    Add    = 0x04,  // 0100
    Delete = 0x08   // 1000
}

組合與判斷

// 調用方:任意組合
GetPrivilege(Privilege.Read | Privilege.Write);
GetPrivilege(Privilege.Read | Privilege.Write | Privilege.Add);

// 處理方:& 判斷單個位
public void GetPrivilege(Privilege p) {
    if ((p & Privilege.Read) == Privilege.Read)   { /* 讀權限邏輯 */ }
    if ((p & Privilege.Write) == Privilege.Write) { /* 寫權限邏輯 */ }
    if ((p & Privilege.Add) == Privilege.Add)     { /* 增權限邏輯 */ }
    if ((p & Privilege.Delete) == Privilege.Delete) { /* 刪權限邏輯 */ }
}

原理解析

  • | (OR) 合併位:任一為 1 則結果為 1
  • & (AND) 檢測位:雙方為 1 才為 1
  • 枚舉值為 2 的冪次(二進制單一 1),任意組合互不干擾,拆分精準

例:Read(0001) | Delete(1000) = 1001。檢測 & Read = 0001 真,& Delete = 1000 真,其他為 0。

優勢

  • 無組合爆炸:N 權限只需 N 個枚舉值,支援 2^N 種組合
  • 編譯期類型安全(配合 [Flags])
  • 性能極高:位運算為 CPU 基本指令
  • 可序列化為整數存儲資料庫

進階用法

  • HasFlag (NET 4.0+):p.HasFlag(Privilege.Read) 更簡潔
  • 移除權限:p &= ~Privilege.Write
  • 切換權限:p ^= Privilege.Add
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved