C 中的位操作

2021-09-05 19:20:50 字數 2374 閱讀 3853

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

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 ;

//取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); //生成的陣列為  

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(...)

當然使用者會屬於一些角色的,而給角色分配的資源操作可能跟給使用者分配的資源操作重疊,

這個時候就需要將2者合併, 修改後的**類似如下

foreach(....)

else

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

C 中的位操作

位操作符是對資料按二進位制位進行運算的操作符。c 位操作符包括 按位與 按位或 按位取反 左移 右移 舉例說明 using system class mikecat a 6的二進位制是00000110,3的二進位制是00000011,按位與後等於00000010,即2。int b 6 3 conso...

C 中的位操作

位操作符是對資料按二進位制位進行運算的操作符。c 位操作符包括 舉例說明 using system class mikecat a 6的二進位制是00000110,3的二進位制是00000011,按位與後等於00000010,即2。int b 6 3 console.writeline b b 6的...

C 中的位操作

位操作符是對資料按二進位制位進行運算的操作符。c 位操作符包括 舉例說明 using system class mikecat a 6的二進位制是00000110,3的二進位制是00000011,按位與後等於00000010,即2。int b 6 3 console.writeline b b 6的...