一種經典位運算的規則


1.在程序中我們常常會用一個字段來記錄多種簡單的類型,例如,管理員管理帖子的時候,一個帖子有置頂,熱議,精品等多個屬性。這些屬性又比較簡單像置頂狀態只有置頂和取消置頂兩種狀態;若是每一個字段都在數據庫中加一個字段,若是狀態比較多的話,就顯的非常冗余;我們可以把這些屬性通過位運算(一組特殊數值)存放在一個數據庫的一個字段中。我們用這組數值來表示我們的一種狀態(如1.置頂 2.取消置頂),之所以稱之為一組特殊的數值,是因為這些存放狀態的數值必須是2n。

2.什么是位運算?

位運算就是二進制數值按照位運算符&(與),|(或),~(取反),^(異或),>>(左移),<<(右移)對二進制數值進行運算,我們知道 程序中的所有數在計算機內存中都是以二進制的形式儲存的。位運算說穿了,就是直接對整數在內存中的二進制位進行操作。

比如,and運算本來是一個邏輯運算符,但整數與整數之間也可以進行and運算。舉個例子,6的二進制是110,11的二進制是1011,那么6 and 11的結果就是2,它是二進制對應位進行邏輯運算的結果(0表示False,1表示True,空位都當0處理)。

3.二進制和十進制是怎么互相轉化的?

 十進制和二進制的相互轉化:把一個二進制數轉化為十進制就是從右到左用二進制的每個數去乘以2的相應次方(次方要從0開始算起);

例如: 1101(2)=1*20+0*21+1*22+1*23=1+0+4+8=13;

4 .二進制位運算符和使用規則:

位運算符號

名稱

規則

例子

&

與運算符

相同位的兩個數字都為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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM