第一章之位向量和位運算


1.基本的位運算符號

&(按位與)

  • 運算符兩邊對應位置都為1時,運算結果位1,否則,只要有一邊為false,則結果為false
  •   將兩邊的值作為二進制展開,依次對每一位進行按位與。作用如下
    •   11100101 & 01011010 = 01000000

 

| (按位或)

  運算符兩邊對應位置有一邊為1時,運算結果為1。只有兩邊同時為0時,結果才為0.

  • 運算符兩邊對應位置有一邊為1時,運算結果為1。只有兩邊同時為0時,結果才為0.  
  • 將兩邊的值作為二進制展開,一次對每一位進行按位或。作用如下
    •   11100101 | 01011010 = 11111111

>> (向右移位)

  一個操作數進行右移運算的時候,結果就是等於操作數除以2的n次方,n就是右移的位數

<< (向左移位)

  一個操作數進行左移運算的時候,實際上就是等於該操作數乘以2的次方,n就是左移的位數

^ (抑或)

  只有兩邊的對應位置的值不一樣時,結果為1,否則結果為0。作用如下

    00000101 ^ 00000011 = 00000110

~ (取反)

  對每一位取反

  00000111 取反  11111000 

2.運算符的一般技巧

  • 位向量:位向量就是用一些二進制位組成的向量。在很多的情況下,我們可以用一個二進制表示一個對象。但是,我們不能直接用一個變量名表示一個位(單獨一個位組成的數據類型是不存在的),於是我們可以考慮將多個位組成基本的數據類型,然后通過對這個基本的數據類型進行操作,從而達到對位進行操作的目的。同時,位了方便,把由位組成的基本數據類型組成數組,這樣就可以對一定范圍的位數據集合進行操作了。
  • &運算的規律:由&運算的規則,任何數和0進行 & 都能被置0,任何數和1進行 & 操作都能獲得其本身
  • | 運算的規律:由 | 運算的規則,任何數和1進行 | 都能被置1,任何數和0進行 | 操作都能獲得其本身
  • c語言移位運算的規則(此處需要了解反碼補碼原碼的內容,移位使用的補碼操作)
    •   移位時,移出的位數全部丟棄,移出的空位補入的數與左移還是右移有關。
      •   如果是左移,則規定補入的數全部是0;
      •        如果是右移,還與被移位的數據是否帶符號有關。若是不帶符號數,則不補入的數全部為0,若是帶符號數,則補入的數全部等於原數的最左端位上的原數(即原符號位)。具體移位規則如下所示
      • 例如,設無符號短整型變量a為0111(對應二進制數為0000000001001001),
           則:a<<3 結果為01110(對應二進制數為0000001001001000),
             a>>4 結果為04 (對應二進制數為0000000000000100),
          又如,設短整型變量a為-4(對應二進制數為 1111111111111100),
           則:a<<3 結果為-32(對應二進制數為1111111111100000),
             a>>4 結果為-1(對應二進制數為1111111111111111)
  • 移位運算和乘除直接的規律:具有如下幾個規則
    •   m/2^n=m>>n
    •        m*2^n=m<<n
    •        m%(2^n)=m&(2^n-1)

5.int 存儲過程中制定位置的獲取和設置

  使用一個大數組,令N=1000000,若數組類型為int,則數組定義為int a[N/32+1](因為一個int占4個字節,一共           是8位,+1實現的進位制度)

        顯然a[0]可以表示0~31的整數,以此類推,a[i]可以表示32*i~32*(i+1)-1的整數,若a[i]中的第j位為1,則表示            待排序介乎額中存在32*i+j這么一個數,否則不存在。對於待排序集合中的某一個元素b,則有:

  i = b / 32;

  j = b % 32;

  這兩句換成位運算可以寫成

  i = b >> 5;

  j = b & 0x1F

       如果要將元素對應位置為1,則按以下方式即可:

      a[i] = a[i] | (0x1 << j)

6.不同類型存儲位向量的問題

char、short、int、long、unsigned char、unsigned short、unsigned int、unsigned long都可以進行移位操作,而double、float、bool、long double則不可以進行移位操作。

 

位運算和乘法之間的一些實例

a*33=a*32+a*1=a*2^5+a*2^0=a<<5+a<<0;


免責聲明!

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



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