計算機只認二進位制。乙個整形int是32位二進位制,我們做許可權,做儲存,經常會遇到如何把乙個int轉換成二進位制或者bool,下面就是二進位制和布林陣列的互轉。
public
static
bool
tobooleanarray(
this
intinteger)
return
booleanarray;
}
public
static
inttointeger(
this
bool
booleanarray)
return
convert.toint32(stringbuilder.tostring(), 2);
}
//十進位制轉二進位制
console.writeline(convert.tostring(69, 2));
//十進位制轉八進位制
console.writeline(convert.tostring(69, 8));
//十進位制轉十六進製制
console.writeline(convert.tostring(69, 16));
//二進位制轉十進位制
console.writeline(convert.toint32(」100111101″, 2));
//八進位制轉十進位制
console.writeline(convert.toint32(」76″, 8));
//十六進製制轉十進位制
console.writeline(convert.toint32(」ff」, 16));
在c#中可以對整型運算物件按位進行邏輯運算。按位進行邏輯運算的意義是:依次取被運算物件的每個位,進行邏輯運算,每個位的邏輯運算結果是結果值的每個位。
c#支援的位邏輯運算子如表2.9所示。
運算符號 意義 運算物件型別 運算結果型別 物件數 例項
~ 位邏輯非運算 整型,字元型 整型 1 ~a
& 位邏輯與運算 2 a & b
| 位邏輯或運算 2 a | b
^ 位邏輯異或運算 2 a ^ b
<< 位左移運算 2 a<<4
>> 位右移運算 2 a>>2
1、位邏輯非運算
位邏輯非運算是單目的,只有乙個運算物件。位邏輯非運算按位對運算物件的值進行非運算,即:如果某一位等於0,就將其轉變為1;如果某一位等於1,就將其轉變為0。
比如,對二進位制的10010001進行位邏輯非運算,結果等於01101110,用十進位制表示就是:
~145等於110;對二進位制的01010101進行位邏輯非運算,結果等於10101010。用十進位制表示就是~85等於176。
2、位邏輯與運算
位邏輯與運算將兩個運算物件按位進行與運算。與運算的規則:1與1等於1,1與0等於0。
比如:10010001(二進位制)&11110000等於10010000(二進位制)。
3、位邏輯或運算
位邏輯或運算將兩個運算物件按位進行或運算。或運算的規則是:1或1等1,1或0等於1,
0或0等於0。比如10010001(二進位制)| 11110000(二進位制)等於11110001(二進位制)。
4、位邏輯異或運算
位邏輯異或運算將兩個運算物件按位進行異或運算。異或運算的規則是:1異或1等於0,
1異或0等於1,0異或0等於0。即:相同得0,相異得1。
比如:10010001(二進位制)^11110000(二進位制)等於01100001(二進位制)。
5、位左移運算
位左移運算將整個數按位左移若干位,左移後空出的部分0。比如:8位的byte型變數
byte a=0x65(即二進位制的01100101),將其左移3位:a<<3的結果是0x27(即二進位制的00101000)。
6、位右移運算
位右移運算將整個數按位右移若干位,右移後空出的部分填0。比如:8位的byte型變數
byte a=0x65(既(二進位制的01100101))將其右移3位:a>>3的結果是0x0c(二進位制00001100)。
在進行位與、或、異或運算時,如果兩個運算物件的型別一致,則運算結果的型別就是運算物件的型別。比如對兩個int變數a和b做與運算,運算結果的型別還是int型。如果兩個運算
物件的型別不一致,則c#要對不一致的型別進行型別轉換,變成一致的型別,然後進行運算。
型別轉換的規則同算術運算中整型量的轉換則一致。
由位運算子連線整型量而成的表示式就是位運算表示式。
常用的位運算主要有與(&), 或(|)和非(~), 比如:
1 && 0 = 0, 1 || 0 = 1, ~1 = 0
在設計許可權時, 我們可以把許可權管理操作轉換為c#位運算來處理.
第一步, 先建立乙個列舉表示所有的許可權管理操作:
[flags][flags]表示該列舉可以支援c#位運算, 而列舉的每一項值, 我們用2的n次方來賦值, 這樣表示成二進位制時剛好是1 = 0001, 2 = 0010, 4 = 0100, 8 = 1000等, 每一位表示一種許可權, 1表示有該許可權, 0表示沒有.public
enum
permissions
接下來是許可權的運算:
1. 許可權的加法, 使用或運算來實現. 我們知道, 0001 | 0100 = 0101, 這樣就表示同時具有第一位和第三位的許可權管理了, 列舉表示為:
permissions per = permissions.insert || permissions.update
2. 許可權的減法, 使用與運算+非運算來實現, 如上面要去掉insert許可權, 操作為:
permissions per &= ~permissions.insert即是 0101 & ~0001 = 0101 & 1110 = 0100
3. 許可權的判斷, 使用與運算, 當判斷用一使用者是否具有該操作許可權時, 要把使用者的的許可權與操作許可權進行與運算, 如果得到的結果仍是操作許可權管理, 則表示使用者具有該許可權:
permissions per = permissions.insert || permissions.update;比較過程為 0101 & 0001 = 0001, 0001的0位用與c#位運算把其它位都置成0, 變成只比較1的這一位.if(per && permissions.insert == permissions.insert)
技巧1:如何去除乙個列舉項:
例如定義了許可權enum permission:
[flags]
public enum permission{
select = 1,
edit = 2,
delete = 4,
view = 8,
all = select | edit | delete | view
可以採用這個函式進行計算:
public static permission clearflag(permission value, permission flag)
value = value & (permission.all^ flag);
return value;
二進位制 二進位制起源
現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...
二進位制巧妙運用 二進位制存多個布林型別狀態值
使用第三個變數來接收 int c 0 c a c 等於1 a b a 等於2 b c b 等於1當然靈活運用,這種方式肯定是不推薦的啦!重新整理一下你對小學數學的理解 a a b a 等於3 b a b b 等於1 a a b a 等於2 既然是程式設計師,我們用程式設計師的方式來做一下,還可以深刻...
JAVA與二進位制
system.out.println 51 7 如上 的結果是 3 答案 00000000 00000000 00000000 00110011 00000000 00000000 00000000 00000111 2進製 計算機內部 只有 2進製資料。任何資訊都必須轉換為2進製,再由計算機處理。...