1.在程序中咱們經常會用一個字段來記錄多種簡單的類型,例如,管理員管理帖子的時候,一個帖子有置頂,熱議,精品等多個屬性。這些屬性又比較簡單像置頂狀態只有置頂和取消置頂兩種狀態;如果每個字段都在數據庫中加一個字段,如果狀態比較多的話,就顯的很是冗餘;咱們能夠把這些屬性經過位運算(一組特殊數值)存放在一個數據庫的一個字段中。咱們用這組數值來表示咱們的一種狀態(如1.置頂 2.取消置頂),之因此稱之爲一組特殊的數值,是由於這些存放狀態的數值必須是2n。數據庫
2.什麼是位運算?spa
位運算就是二進制數值按照位運算符&(與),|(或),~(取反),^(異或),>>(左移),<<(右移)對二進制數值進行運算,咱們知道 程序中的全部數在計算機內存中都是以二進制的形式儲存的。位運算說穿了,就是直接對整數在內存中的二進制位進行操做。內存
好比,and運算原本是一個邏輯運算符,但整數與整數之間也能夠進行and運算。舉個例子,6的二進制是110,11的二進制是1011,那麼6 and 11的結果就是2,它是二進制對應位進行邏輯運算的結果(0表示False,1表示True,空位都當0處理)。ci
3.二進制和十進制是怎麼互相轉化的?table
十進制和二進制的相互轉化:把一個二進制數轉化爲十進制就是從右到左用二進制的每一個數去乘以2的相應次方(次方要從0開始算起);二進制
例如: 1101(2)=1*20+0*21+1*22+1*23=1+0+4+8=13;程序
4 .二進制位運算符和使用規則:數據
位運算符號top |
名稱計算機 |
規則 |
例子 |
& |
與運算符 |
相同位的兩個數字都爲1,則爲1;如有一個不爲1,則爲0。 |
1 & 1 =1;0 & 0=0 1 & 0 = 0 ;0 & 1=0 |
| |
或運算符 |
相同位只要一個爲1即爲1。
|
1 | 1=1 ;0|0=0 1 |0=1;0|1=1 |
^ |
異或運算符 |
相同位不一樣則爲1,相同則爲0。 |
1 ^1=0 ;0^0=0 1 ^0=1;0^1=1 |
~ |
取反運算符 |
0和1所有取反。 |
~1=0;~0=1 |
<< |
左移運算 |
右邊空出的位用0填補,高位左移溢出則捨棄該高位。 |
|
>> |
右移運算 |
左邊空出的位用0或者1填補。正數用0填補,負數用1填補。低位右移溢出則捨棄該位 |
|
4.十進制數2n對應的二進制值,認真研究一下這組數據你就會發現其中的奧妙:
二進制數值 | 00000001 |
00000010 |
00000100 |
00001000 |
00010000 |
00100000 |
01000000 |
10000000 |
100000000 |
十進制數值 | 20 =1 |
21 =2 |
22=4 |
23=8 |
24=16 |
25=32 |
26=64 |
27=128 |
28=256 |
經過仔細觀察研究咱們發現十進制數1,2,4,8,16,32,64.......2n 。他們轉化爲二進制進行位運算有一種規律,下面咱們經過一個例子來理解這種規律
管理員在管理咱們帖子的時候,能夠對咱們的帖子進行置頂,熱議,鎖定等操做,咱們在數據庫中用一個字段Status來記錄這些操做,咱們能夠建立一些枚舉值來表示這些操做狀態 1 :鎖定 2:置頂 4:熱議 8:其餘狀態 。。。。。。。
(1)一個帖子同時是熱議和置頂的,那麼它的Status=2|4=2+4=6 數據庫Status中保留的就是6,如果再鎖定,Status=2|4|1=7 數據庫Status中保留的就是7。
(2)取消置頂Status= Status&(~2)=6&(~2)=6-2=4(至關於減法)
(3)判斷這個帖子是否置頂 Status&2 =6&2=2就說明置頂狀態(2)包含在6中;
(1)添加元素:(因爲這一組數字都是2n,他們轉化爲二進制都只是在所在的位上,因此經過或運算實際上就是這兩個數相加)
|
|運算符 |
|
1|2 |
00001|00010=00011 |
20|21=20+21=3 |
1|4 |
00001|00100=00101 |
20|22=20+22=5 |
2|8 |
00010|01000=01010 |
21|23=21+23=10 |
1|2|8 |
00001|00010|01000=01010 |
20|21|23=20+21+23=11 |
(2)判斷一個元素是否存在:(要判斷的那個數如果包含在Status(經過或運算得出來的值)中經過與運算只能獲得本身的值)
&十進制運算 |
&二進制運算 |
結果 |
10&8 |
1010&1000=1000 |
8 |
10&2 |
1010&10=0010 |
2 |
11&8 |
1011&1000=1000 |
8 |
(3)移除一個元素:(經過取反運算獲得本身數的反數,而後再進行與運算就把這個數個移除了)
十進制 |
二進制 |
十進制結果 |
10&(~8) |
1010&(~1000)=0010 |
2 |
10&(~2) |
1010&(~0010)=1000 |
8 |
11&(~8) |
1011&(~1000)=0011 |
3 |