二進位制與布林陣列

2022-02-10 19:00:00 字數 3642 閱讀 4923

計算機只認二進位制。乙個整形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]

public

enum

permissions 

[flags]表示該列舉可以支援c#位運算, 而列舉的每一項值, 我們用2的n次方來賦值, 這樣表示成二進位制時剛好是1 = 0001, 2 = 0010, 4 = 0100, 8 = 1000等, 每一位表示一種許可權, 1表示有該許可權, 0表示沒有.

接下來是許可權的運算:

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;  

if(per && permissions.insert == permissions.insert)   

比較過程為 0101 & 0001 = 0001, 0001的0位用與c#位運算把其它位都置成0, 變成只比較1的這一位.

技巧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進製,再由計算機處理。...