亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

位運算的威力 好厲害~~~

2019-11-14 11:31:47
字體:
來源:轉載
供稿:網友
一、有關位運算的基礎知識總結位運算包括:&(與)、|(或)、^(異或)、~(取反)、>>(右移)、<<(左移)環境預設:32位機下面,int占2個字節,有符號int a = 11;int b = 1000;(a)2 = (00000000 00001011 )2                                            //a的二進制表示(b)2 = (00000011 11101000 )2                                            //b的二進制表示a&b =(00000000 00001000 )2 =(8)10                             //一一為一,其它為0a|b =  (00000011 11101011 )2 =(1003)10                    //有一為一,零零為0a^b = (00000011 11100011 )2 =(995)10                       //相同為0,不相同為1~b =   (11111100 00010111 )2 =(-31767)10               //按位取反b>>3 =  (00000000 01111101 )2 =(125)10                   // 去掉低3位,高位補0或      =  (11100000 01111101 )2 =(-24701)10           //去掉低3位,高位補1    補0還是1具體情況視編譯環境決定a<<3 =  (00000000 01011000 )2 =(88)10                    //去掉高3位,低位補0    看了上面的例子,相信你已經明白具體規則了,不明白自己去google。下面講具體作用。    位運算應用口訣清零取數要用與,某位置一可用或若要取反和交換,輕輕松松用異或例1.子網掩碼    子網掩碼是個啥東東我也就不講了,計算機科學技術本身就是個非常龐大系統,一個人不可能面面俱到,但是一些基本的嘗試還是要懂的,不懂的可以自己去google,也可以等我的相關網絡方面的文章。這里只講與本問有關的應用部分。    假如我是一個網管,公司內部使用C類地址,現在我要把公司網絡劃分成5個子網,網絡號為192.168.1.0的前三段,那么子掩碼怎么填呢?    我現在先告訴你子網的子網掩碼分別怎么填:192.168.1.224。(當然這里還有其他答案,我取的是在子網擴充不超過8個的情況下的每個子網所容納主機最多的最佳方案)。    這個怎么來的呢?ip本身是個二進制的東東,為了方便人們設置,我們采用了點分十進制的轉換,把32位的ip地址轉換成了4個字節的十進制萊表示。比如 192.168.1.213 這個ip地址的二進制表示為:11000000 10101000 00000001 11010101 。對于C類地址默認的前三個字節表示網絡號,那么這個網絡號就是:11000000 10101000 00000001   ,最后一個字節11010101表示主機號,可以知道這個網絡可以容納的最多主機數為2^8-2,為什么減2自己去查?,F在要劃分子網,那么我們就要從表示主機的那個字節也就是8個位里面拿出幾個位來表示子網號, 幾位比較合適呢?這就要看你需要劃分多少個子網咯。比如我們現在要劃分5個子網,(5)10 = (101)2 ,那么至少就需要3位了,而且最多可以劃分2^3 = 8個子網。現在你把224換成二進制看看吧(224)10 = (11100000)2  ,明白了吧,我們可以推斷出子網掩碼干了什么勾當?不錯子網掩碼與ip地址做了按位與運算,他的作用就是屏蔽了主機號獲取網絡號與子網號。如果你明白了這點,你就知道自己在192.168.1.64子網的ip該怎么填了,不會錯誤滴填成192.168.1.10了。     竟然扯到一邊去了,講了半天才講了一個與運算的應用。例2. 防止int型變量溢出    int x = 32760;int y = 32762; 要求求x、y的平均值,要求空間復雜度位O(0)。    你能用常規方法去解決嗎?可以。我不會講,這里只講位運算的 方法。int ave(int x, int y)   //返回X、Y的平均值{        return (x & y) + ( (x^y)>>1 );}知識點:>>n 相當于除于2^n ,<<n 相當于乘于2^n .                 x,y對應位均為1,相加后再除以2還是原來的數,如兩個00001000相加后除以2仍得00001000,那么我們把x與y分別分成兩個部分來看,兩者相同的位分別拿出來 則 :x = (111111111111000)2 =  (111111111111000)2 +  (000000000000000)2y =  (111111111111010)2 =  (111111111111000)2 +  (000000000000010)2相同部分我們叫做x1,y1,不同部分我們叫做x2,y2.那么現在(x+y)/2 =(x1+y1)/2 +(x2 + y2)/2 ,因為x1 == y1 ,所以(x1+y1)/2 ==x1 ==y1,相同部分我們用與運算求出來 x1 = x&y ,不同部分的和我們用^求出來,然后除于2是不是我們想要的結果了呢?言至于此,無需再言!            這個例子有點難于理解.但是經過我的分解應該還算好理解了,弄懂這個例子相信你的位運算已經登入大門了。例3.《有關集合算法的實現一些學習筆記》中的"算法2" 算法2. 將整數index的元素插入集合(閱讀此例請先閱讀該文)int insert(BitSet* s,int index){    if(index >=0 && index>>3 < s->size)        {s->array[index>>3] |= (1<< (index & 7) );return 1}    return 0;}代碼詳解:index>=0不解釋,(index>>3 )< s->size 這個是保證  index  < n 的。因為index<=n-1,所以 index/8 <=(n-1)/8,又因為 index < n+7 ==(n-1) +8,所以index/8 < (n-1)/8 +8/8 == s->size。因為array的下標是0到size-1,index>>3也就是index/8取整也就是index下標所在的字節,index&7  等價于  index & 0000000 00000111 ,就是取index二進制編碼的低三位也就是相當于index>>3所剩下的余數,余數對應的十進制就是index所在字節的序號( 這個序號也是從0開始,并且從右至左),所以把1左移相應的位數就是index在n中對應bit了,再把s->array[index>>3]也就是index所在的字節與(1<<(index&7))也就是除了index所在的位以外均為0或運算,這樣無論index所對應位原先是什么狀態,之后都被置1。這個可能比上一個例子難度大多了,這個需要掌握位向量的相關知識,如果你不能看懂就跳過吧。    以上是我自己的一些學習心得。下面將貼上一些網絡上的例子。 應用舉例(1) 判斷int型變量a是奇數還是偶數           a&1   = 0 偶數       a&1 =   1 奇數(2) 取int型變量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1   (先右移再與1)

(3) 將int型變量a的第k位清0,即a=a&~(1<<k)    (10000 取反后為00001 )

(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)

(7)對于一個數 x >= 0,判斷是不是2的冪。

boolean power2(int x){    return ( (x&(x-1))==0) && (x!=0);}

(8)不用temp交換兩個整數void swap(int x , int y){ x ^= y; y ^= x; x ^= y;}

(9)計算絕對值

int abs( int x ){ int y ; y = x >> 31 ; return (x^y)-y ;        //or: (x+y)^y}

(10)取模運算轉化成位運算 (在不產生溢出的情況下)         a % (2^n) 等價于 a & (2^n - 1)(11)乘法運算轉化成位運算 (在不產生溢出的情況下)         a * (2^n) 等價于 a<< n(12)除法運算轉化成位運算 (在不產生溢出的情況下)         a / (2^n) 等價于 a>> n        例: 12/8 == 12>>3(13) a % 2 等價于 a & 1       (14) if (x == a)

                  x= b;   else      x= a;        等價于 x= a ^ b ^ x;(15) x 的 相反數 表示為 (~x+1)(16)輸入2的n次方:1 << 19(17)乘除2的倍數:千萬不要用乘除法,非常拖效率。只要知道左移1位就是乘以2,右移1位就是除以2就行了。比如要算25 * 4,用25 << 2就好啦

 

實例     功能              |          示例            |    位運算 ----------------------+---------------------------+-------------------- 去掉最后一位          | (101101->10110)          | x >> 1 在最后加一個0        | (101101->1011010)        | x < < 1 在最后加一個1        | (101101->1011011)        | x < < 1+1 把最后一位變成1      | (101100->101101)          | x | 1 把最后一位變成0      | (101101->101100)          | x | 1-1 最后一位取反          | (101101->101100)          | x ^ 1 把右數第k位變成1      | (101001->101101,k=3)      | x | (1 < < (k-1)) 把右數第k位變成0      | (101101->101001,k=3)      | x & ~ (1 < < (k-1)) 右數第k位取反        | (101001->101101,k=3)      | x ^ (1 < < (k-1)) 取末三位              | (1101101->101)            | x & 7 取末k位              | (1101101->1101,k=5)      | x & ((1 < < k)-1) 取右數第k位          | (1101101->1,k=4)          | x >> (k-1) & 1 把末k位變成1          | (101001->101111,k=4)      | x | (1 < < k-1) 末k位取反            | (101001->100110,k=4)      | x ^ (1 < < k-1) 把右邊連續的1變成0    | (100101111->100100000)    | x & (x+1) 把右起第一個0變成1    | (100101111->100111111)    | x | (x+1) 把右邊連續的0變成1    | (11011000->11011111)      | x | (x-1) 取右邊連續的1        | (100101111->1111)        | (x ^ (x+1)) >> 1 去掉右起第一個1的左邊 | (100101000->1000)        | x & (x ^ (x-1)) 判斷奇數       (x&1)==1 判斷偶數        (x&1)==0        


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区三区三区在线观看| 国产精品一区二区av影院萌芽| 国产亚洲精品美女久久久| 色天天综合狠狠色| 欧美视频精品一区| 亚洲精品videossex少妇| 欧美日韩性视频在线| 久久乐国产精品| 国产精品十八以下禁看| 国产69精品久久久久99| 红桃视频成人在线观看| 国产精品久久久久久久久久久新郎| 亚洲精品自拍偷拍| 自拍偷拍亚洲在线| 亚洲老板91色精品久久| 91日韩在线视频| 国内伊人久久久久久网站视频| 欧美成人免费全部| 亚洲性av在线| 欧美特黄级在线| 亚洲伊人成综合成人网| 97视频免费在线观看| 亚洲免费小视频| 亚洲综合社区网| 精品国产老师黑色丝袜高跟鞋| 北条麻妃久久精品| 毛片精品免费在线观看| 欧美成人午夜剧场免费观看| 国产一区二区丝袜| 国产亚洲精品一区二区| 亚洲高清色综合| 麻豆国产va免费精品高清在线| 国产精品美女久久| 91av视频在线| 久久综合网hezyo| 国产欧美亚洲精品| 91精品国产一区| 欧美成人精品一区| 亚洲精品久久久久久久久| 日韩黄在线观看| 亚洲精品中文字| 欧美综合国产精品久久丁香| 精品国产一区二区三区久久久狼| 91欧美视频网站| 精品国产欧美一区二区五十路| 精品中文字幕在线2019| 中文亚洲视频在线| 中文字幕亚洲一区二区三区五十路| 亚洲毛片在线免费观看| 亚洲新声在线观看| 国产精品 欧美在线| 亚洲自拍偷拍一区| 亚洲国产成人av在线| 久久久精品亚洲| 亚洲国产精品久久久久秋霞不卡| 成人精品视频在线| 色妞色视频一区二区三区四区| 91欧美日韩一区| 亚洲欧美资源在线| 日韩av成人在线观看| 国产午夜精品麻豆| 久久久国产精品免费| 中文字幕av日韩| 亚洲欧洲日产国产网站| 91青草视频久久| 中文字幕在线看视频国产欧美在线看完整| 国产精品亚洲аv天堂网| 欧美亚洲另类制服自拍| 91亚洲国产成人久久精品网站| 欧美色道久久88综合亚洲精品| 欧美大尺度激情区在线播放| 欧美国产日韩中文字幕在线| 美日韩精品视频免费看| 亚洲欧美福利视频| 亚洲欧美色图片| 中文字幕欧美视频在线| 日韩欧美一区二区三区| 亚洲一区二区久久久久久| 国产mv久久久| 成人精品网站在线观看| 欧美日韩精品在线观看| 亚洲一区二区三区视频播放| 亚洲高清av在线| 精品国偷自产在线| 日韩精品免费一线在线观看| 亚洲最大的成人网| 久久国产视频网站| 亚洲精品成人久久| 国产日产久久高清欧美一区| 亚洲桃花岛网站| 国产精品久久久久久久久久久不卡| 亚洲免费人成在线视频观看| 久久精品亚洲国产| 日韩精品视频在线免费观看| 日韩在线视频网| 91精品综合久久久久久五月天| 久久国产视频网站| 国产精品久久久久久久一区探花| 欧美综合在线观看| 欧洲美女7788成人免费视频| 国内免费久久久久久久久久久| 欧美色播在线播放| 91精品美女在线| 国产精品国产三级国产专播精品人| 欧美夜福利tv在线| 亚洲色图五月天| 91影院在线免费观看视频| 欧美日韩精品在线| 91国偷自产一区二区三区的观看方式| 亚洲欧美日韩一区二区在线| 98精品国产高清在线xxxx天堂| 亚洲美女av电影| 亚洲欧美三级在线| 亚洲淫片在线视频| 欧美国产在线视频| 亚洲国产精品美女| 亚洲欧美中文日韩v在线观看| 国产盗摄xxxx视频xxx69| 亚洲国产一区自拍| 2019中文字幕在线观看| 国产精品久久久久久久久久久不卡| 在线视频欧美日韩| 免费91在线视频| 美女扒开尿口让男人操亚洲视频网站| 欧美精品免费看| 91精品国产自产在线观看永久| 91精品国产高清自在线| 欧美xxxx18性欧美| 国产精品日韩在线播放| 亚洲精品国产综合久久| 国产日本欧美一区二区三区| 成人国产精品免费视频| 亚洲最新视频在线| 蜜臀久久99精品久久久久久宅男| 中文字幕免费精品一区高清| 亚洲欧美综合区自拍另类| 亚洲视频一区二区三区| 久久久国产视频91| 在线精品视频视频中文字幕| 午夜精品一区二区三区在线播放| 亚洲欧美在线一区二区| 91亚洲精品久久久久久久久久久久| 亚洲欧美精品伊人久久| 亚洲tv在线观看| 欧美午夜影院在线视频| 亚洲国产欧美在线成人app| 欧美与欧洲交xxxx免费观看| 欧洲亚洲妇女av| 91在线免费网站| 色偷偷88888欧美精品久久久| 国产精品99免视看9| 日韩中文字幕在线| 色一情一乱一区二区| 欧美色视频日本版| 久久精品视频亚洲| 欧美日韩高清在线观看| 国产mv免费观看入口亚洲| 国产精品男女猛烈高潮激情| 97热精品视频官网| 久久理论片午夜琪琪电影网| 久久精品中文字幕一区| 亚洲欧美在线免费| 日韩电影免费观看在线观看| 久久777国产线看观看精品|