一種經典位運算的規則

2022-02-16 18:01:20 字數 2597 閱讀 4915

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|200001|00010=00011

20|21=20+21=3

1|400001|00100=00101

20|22=20+22=5

2|800010|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

810&2

1010&10=0010

211&8

1011&1000=1000

8(3)移除乙個元素:(通過取反運算得到自己數的反數,然後再進行與運算就把這個數個移除了)

十進位制二進位制

十進位制結果

10&(~8)

1010&(~1000)=0010

210&(~2)

1010&(~0010)=1000

811&(~8)

1011&(~1000)=0011

3

Fibonacci數列的一種經典遞迴實現

剛才.net課程期末考試,正好最後一題考的是遞迴實現fibonacci數列.順便就把 打出來發在這裡.雖然沒什麼技術含量 wink 主要特性就是使用buffer將先前已經計算過的fibonacci數列的值儲存下來,減少遞迴時的重複計算開銷.c 沒直接的lazy evaluation,這種採取buff...

經典的一種觀察者模式實現

為你的類class target設計乙個觀察者基類class observer,同時設計乙個觀察者容器 typedef std listobserver list 再為observer設計一系列的虛函式,表示事件處理函式,在某一事件發生時,對容器內的所有觀察者呼叫一次該處理函式。如果在lua裡就會更...

經典應用培訓,一種被坑的感覺

這幾天,和同伴產興高采烈的報名去聽某老師的iphone經典應用培訓課,費用4800元 人,貴無所謂吧,只要有內容就成。第一天,記得是講了蘋果相關產品,其實說白了,就是iphone,ipad的,還講了一些objective c,如property,catalog之類的,還很蛋疼的扯了一下虛擬記憶體,資...