C#中的位操作

來源:互聯網
上載者:User

   比較基礎的東西,平時用的不多,真到碰到時卻不會用了,下面是整理的一些資料

 int類型即Int32, 由4個位元組32位表示,高第31位(編號從零開始)用來表示正負,1為負數,0為正數 (左表示高位,右表示低)
 int 類型的負數是採用補碼來表示的,即在對應的int類型正數上按位求反後再加1
 比方計算-1,其正數為 0000000...001(31個零跟一個1) 那麼按位求反後應該是 111111111....10 ,再加1的結果是11111111...111(32個1).

 long類型跟int類似,只不過long由8位元組64位表示
 
 資料轉換常用代碼
//將16進位數0XFFFFFFFF轉換為整數(Int32)
MessageBox.Show( Convert.ToInt32("FFFFFFFF", 16).ToString()); //顯示 -1
//將2進位數11111111轉換為整數(Int32),注意11111111 等效於 0000...00011111111 (前面24個零)
MessageBox.Show(Convert.ToInt32("11111111",2).ToString());// 顯示 255

//將整數-1轉換成2進位字串
MessageBox.Show(Convert.ToString(-1, 2)); // -1的二進位表示,顯示11111....11 (32個1)
//將整數-1轉換成16進位字串
MessageBox.Show(Convert.ToString(-1, 16)); // -1的16進位表示,顯示FFFFFFFF

 使用BitConverter
   byte[] bytes = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF,0 ,0};
   //取bytes資料的第0個到第3個元素(int類型有4個位元組) ,轉化成整數
   MessageBox.Show( BitConverter.ToInt32(bytes, 0).ToString()); //顯示 -1;
  //將byte[] 數組表示成十六進位字串序列,各元素轉化後用 "-"串連,順序不變
   MessageBox.Show( BitConverter.ToString(bytes)); //顯示 FF-FF-FF-FF-0-0
 //擷取10(Int32)的位元組數組
 byte[] arr=BitConverter.GetBytes(10); //產生的數組為 {10,0,0,0} 
 MessageBox.Show(BintConverter.ToString(arr)); //顯示為0A-0-0-0;
 這裡注意10的Int32記憶體表示方法是 00-00-00-0A(高位元組左邊低位元組在右邊) ,而上面的是通過BinConverter轉化後是高位元組在右邊低位元組在左邊.
 
 使用位操作
 在開發一些帶許可權控制的功能時我們有可能用到位操作,
 比方系統中有一些資源,每個資源對應一組操作,假設有8種操作
 這個時候你就可以設計這麼一張表
資源使用者動作表(使用者名稱,資源號,操作類型)
一些資料:
             tools  1, 1
             tools  2, 2
             tools  1 , 3
             alsve  3, 1
             alsve  1,2

 
在上面我們用數字1~8表示8種操作,顯然如果一個使用者對某一資源擁有全部許可權的話就需要8條記錄來表示,如果使用者達到幾十萬層級時這個表的資料量將會很龐大.

 改用位來表示操作

 資源使用者動作表(使用者名稱,資源號,運算元)
 這裡我們使用了運算元,他是int類型的整數 我們使用其低8位來表示某使用者對某資源擁有操作,對應位為1則表示有相應許可權,為零則表示沒有.

 在上面的規則下我們需要用到以下操作
 1.判斷某一位是否為1 即使用者是否擁有某資源的某一操作,
  bool運算式  (運算元 & (1<< 位置)) > 0;
 2.設定某一位為1,即將某一資源的某一操作分配給使用者
 運算元=運算元 | (1<<位置);
 3. 設定某一位為0,即將使用者對某一資源的某一操作取消
 運算元=運算元 &  (~(1<<位置)); //移位後,按位求反,再與運算元做與操作

一些實現細節 
使用者登入後一次性將使用者的資源操作資料載入到 Hashtable裡(包括使用者屬於的角色指派的資源操作資料)
代碼類似如下:
foreach(...){
 hash.Add("資源號","運算元") ;
}
 當然使用者會屬於一些角色的,而給角色指派的資源操作可能跟給使用者指派的資源操作重疊,
 這個時候就需要將2者合并, 修改後的代碼類似如下
foreach(....){
            if (hash.ContainsKey("資源號"))
            {
                hash["資源號"] = (int)hash["資源號"] | "運算元";
            }
            else
            {
                hash.Add("資源號", "運算元");
            }
}

  Hashtable可以方便的序列化,序列化後的資料可以儲存在 Session(使用SQL儲存Session)或者儲存在加密的ViewState裡面,當然同樣可以把ViewState儲存到SQL伺服器裡,不過,使用SQL Session 比較方便

 
 
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.