二進位制巧妙運用 二進位制存多個布林型別狀態值

2021-09-04 19:27:17 字數 3996 閱讀 4621

①使用第三個變數來接收

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

③既然是程式設計師,我們用程式設計師的方式來做一下,還可以深刻理解一下^

//如果m、n兩個值不相同,則異或結果為1。如果m、n兩個值相同,異或結果為0。

//1 的二進位制 : 0000 0001

//2 的二進位制 : 0000 0010

//3 的二進位制 : 0000 0011

a = a ^ b;

// a 等於 1 ^ 2 = 0000 0011 = 3

b = a ^ b;

// b 等於 3 ^ 2 = 0000 0001 = 1

a = a ^ b;

// a 等於 3 ^ 1 = 0000 0010 = 2

異或也叫半加運算,(相當於二進位制個位相加,結果看個位)其運算法則相當於不帶進製的二進位制加法:二進位制下用1表示真,0表示假,則異或的運算法則為:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同為0,異為1),這些法則與加法是相同的,只是不帶進製,所以異或常被認作不進製加法。

是不是很奇妙。下面看乙個一樣奇妙的與& 、 或 | 的操作。

手機號郵箱身份證

位址緊急聯絡人

qq銀行卡10

1010

11二進位制中

int bankcard =1;

int qq =

2<<0;

int wechat =

2<<1;

int person =

2<<2;

int idcard =

2<<3;

int addr =

2<<4;

int email =

2<<5;

int phone =

2<<

6;

在將上面的這些值轉換為二進位制的數:

//不一定是8位的二進位制資料,只是演示,節目效果

0000

0001:銀行卡

0000

0010:qq

0000

0000

1000:緊急聯絡人

0001

0000:位址

0010

0000:身份證

0100

0000:郵箱

1000

0000:手機號

那麼轉化為上面的格仔的圖,是不是就是這樣。

手機號郵箱

身份證位址

緊急聯絡人

qq銀行卡11

1111

11如果認證了手機號,就在手機號裡面填1,沒認證就是0,其他的也一樣。

int state=

0;

state = state | phone ;

·····························解析·····························

//0000 0000 ——>state開始時候的二進位制

//1000 0000 ——>phone的二進位制

//1000 0000 ——>|(或)運算結果,state變成了1000 0000,從而實現儲存

//實現了phone的存入,其他資料類似,

int state =

10;

phone = state & phone;

·····························解析·····························

//state為任意值,為了驗證有繫結的,也有沒繫結的,所以取個10。

//0000 1010 ——>state=10的二進位制

//1000 0000 ——>phone二進位制

//0000 0000 ——>&(與)結果為0,說明還沒有繫結手機

----

----

----

----

----

----

----

----

----

----

----

----

----

----

-------

qq = state & qq ;

·····························解析·····························

//0000 1010 ——>state=10的二進位制

//0000 0010 ——>qq二進位制

//0000 0010 ——>&(與)結果為 2 << 0,即qq的二進位制,說明已經繫結了qq

綜上所述,只要判斷state&《變數名》是否為0,即可得出是否繫結

這樣可存可取,是不是比原來宣告8個boolean型別的變數要好呢?在我們閱讀原始碼的時候也經常會遇到這樣的訪問方式,了解便好!

另外,還有一種情況,就是已經繫結了手機號,但是需要取消繫結,這個時候使用&|就不能達到需求了。這個時候就需要上面講過的^。

還用state=10來舉例子,已知10裡面存入了『qq』和『緊急聯絡人』,看看怎麼取消qq的繫結。

int state =10;

state = state ^ qq ;

·····························解析·····························

//0000 1010 ——>state=10的二進位制

//0000 0010 ——>qq二進位制

//0000 1000 ——>^(異或)結果為2<<2,表示state僅剩緊急聯絡人,成功取消qq

/**

* @param states

* 當前狀態值

* @param value

* 需要判斷狀態常量

* @return 是否存在

*/public

static

boolean

hasstate

(integer states,

integer value)

/** * @param states

* 當前狀態值

* @param value

* 需要新增狀態常量

* @return 新的狀態值

*/public

static

integer

addstate

(integer states,

integer value)

return

(states | value);}

/** * @param states

* 當前狀態值

* @param value

* 需要刪除狀態常量

* @return 新的狀態值

*/public

static

integer

removestate

(integer states,

integer value)

return states ^ value;

}

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

巧妙運用二進位制驗證許可權

在許可權分配中有多個許可權級別,不同使用者分別有多個不同的許可權。論壇的許可權 檢視 發帖 投票 搜尋 使用者的許可權 使用者a 檢視 發帖 使用者b 檢視 使用者c 檢視 發帖 投票 搜尋 分析 有四種不同的許可權級別,總共2 4種許可權分配方式。像這樣許可權等級劃分和不同級別使用者的許可權分配採...

巧妙運用二進位制驗證許可權

在許可權分配中有多個許可權級別,不同使用者分別有多個不同的許可權。論壇的許可權 檢視 發帖 投票 搜尋 使用者的許可權 使用者a 檢視 發帖 使用者b 檢視 使用者c 檢視 發帖 投票 搜尋 分析 有四種不同的許可權級別,總共2 4種許可權分配方式。像這樣許可權等級劃分和不同級別使用者的許可權分配採...