久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 愛上位運算 [打印本頁]

作者: 51黑tt    時間: 2016-3-6 02:09
標題: 愛上位運算
緣起:C語言區別于其它語言的重要特點是支持位運算,使其能夠完成匯編語言所能完成的大部分功能。但是學校開設的C語言課程中老師往往將位運算這一章一代而過,好像這一張根本不重要。但是在實際的編程中借助于位運算往往可以設計出簡潔的算法,使程序簡化,并且獲得較高的效率。而且在某些對硬件進行控制的編程中,位運算是必不可少的。因此筆者參考了相關書籍,總結了一些規律和助記口訣,希望對讀者有所幫助。

一 優先級(高—〉低)
! ~  算術運算符 關系運算符 & ^ | && || 賦值

二 移位運算  <<   >;>;
要點 1 它們都是雙目運算符,兩個運算分量都是整形,結果也是整形。
     2 左移:右邊空出的位上補0,左邊的位將從字頭擠掉,其值相當于乘2。
     3 右移:右邊的位被擠掉。對于左邊移出的空位,如果是正數則空位補0,若為負數,可能補0或補1,這取決于所用的計算機系統。
       移入0的叫邏輯右移,移入1的叫算術右移,Turbo C采用邏輯右移。

三 位運算符的應用  (源操作數s 掩碼mask)
(1) 按位與—— &
  1 清零特定位 (mask中特定位置0,其它位為1,s=s&mask)

  2 取某數中指定位 (mask中特定位置1,其它位為0,s=s&mask)

(2) 按位或—— |
    常用來將源操作數某些位置1,其它位不變。 (mask中特定位置1,其它位為0 s=s|mask)

(3) 位異或—— ^
  1 使特定位的值取反 (mask中特定位置1,其它位為0 s=s^mask)

  2 不引入第三變量,交換兩個變量的值  (設 a=a1,b=b1)
    目 標           操 作              操作后狀態
    a=a1^b1         a=a^b              a=a1^b1,b=b1
    b=a1^b1^b1      b=a^b              a=a1^b1,b=a1
    a=b1^a1^a1      a=a^b              a=b1,b=a1

四 位運算應用口訣
清零取反要用與,某位置一可用或
若要取反和交換,輕輕松松用異或

五 應用舉例
    (1) 判斷int型變量a是奇數還是偶數
            |- 0 偶數
a&1=|
            |- 1 奇數
    (2) 取int型變量a的第k位 (k=0,1,2……sizeof(int))
a>;>;k&1
    (3) 將int型變量a的第k位清0
a=a&~(1<<k)
    (4) 將int型變量a的第k位置1
a=a|(1<<k)
    (5) int型變量循環左移k次
a=a<<k|a>;>;16-k   (設sizeof(int)=16)
    (6) int型變量a循環右移k次
a=a>;>;k|a<<16-k   (設sizeof(int)=16)

六 例題
1 實現一個函數itob(),使用移位運算將從鍵盤上輸入的整數轉換為它的二進制表示形。
解: char * itob(int n,char *ps)
             {
                int i;
                static int size=8*sizeof(int);
                for(i=size-1;i>;=0;i--,n>;>;=1)
                   ps[i]=(1&n)+'0';
                ps[size]='\0';
                return ps;
             }
2 編寫一個函數 invert_end(),反轉一個值中最后n位,并將結果返回。
解: int  invert_end(int num,int bits)
             {
                int mask=0;
                int bitval=1;
                while(bits-- >;0)
                {
                   mask|=bitval;
                   bitval<<=1;
                }
                return num^mask;
             }
七 實戰練習
1 編寫一個將二進制字符串轉化為數值的函數
   若有 char *bin="01001001";
          那么可將bin作為參數傳給該函數,使函數返回值為25。
2 編寫一個函數,該函數接受一個int參數,并返回該參數中打開的位的數量。
3 編寫一個函數,該函數接受兩個參數:一個值和一個位置。如果制定的位上的值是1,函數返回1,否則返回0。
八 總結
  (1) 在了解了各種位運算的操作原理后,最好熟記各運算符的優先級。在閱讀別人寫的代碼是你可以去查書,但自己寫程序時還是
      熟能生巧。
  (2) 如你所見,在不引入第三變量的情況下使用異或運算就可以將兩個變量的交換,本文給除了操作過程,你應當仔細分析一下。
      感覺就像變魔術一般神奇
  (3) 判斷一個整數a的奇偶性通常的做法是看 a%2的結果是0還是1,這沒什么不對,但是要知道%運算要比相應的位運算慢的多啦,
      對十個數進行奇偶判斷就無所謂啦,哪種方法都ok,但是若要對T數量級的數進行操作,你就不得不考慮一下效率問題了!

  本文主要參考了 《C Primer Plus (第四版)》,本文的例題也來自這本書。





歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 一区二区国产精品 | 欧美视频在线播放 | 色视频网站在线观看 | 三区在线| 日韩精品在线网站 | 欧美一区二区在线播放 | 国产成人综合一区二区三区 | 久久逼逼 | av高清毛片 | 国产在线成人 | av中文在线播放 | 日本一区二区高清视频 | www成年人视频 | 欧美一区精品 | 操操操操操 | 国产成人精品一区二三区在线观看 | 亚洲成av人片在线观看 | 国产电影一区二区在线观看 | 天天天操天天天干 | 久久免费福利 | 欧美一区二区三区在线观看视频 | 婷婷成人在线 | 久久久久久91 | 日日天天 | 99精品99 | 亚洲永久免费观看 | 国产精品久久久久无码av | 在线色网| 日韩欧美国产综合 | 国产999精品久久久久久 | 欧美一区二区三区视频 | 国产精品久久久久久亚洲调教 | 日韩成人免费 | 一区二区三区在线播放 | 自拍偷拍第1页 | 懂色av色香蕉一区二区蜜桃 | 亚洲区一区二 | 在线观看国产精品视频 | 亚洲精品电影在线观看 | 久久精品国产一区二区电影 | 久久国产一区 |