<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      書山有徑勤為路>>>>>>>>

      <<<<<<<<學(xué)海無涯苦作舟!

      最基本的位運(yùn)算

      === 1. and運(yùn)算 ===( & )

        and運(yùn)算通常用于二進(jìn)制取位操作,例如一個(gè)數(shù) and 1的結(jié)果就是取二進(jìn)制的最末位。這可以用來判斷一個(gè)整數(shù)的奇偶,二進(jìn)制的最末位為0表示該數(shù)為偶數(shù),最末位為1表示該數(shù)為奇數(shù).

        相同位的兩個(gè)數(shù)字都為1,則為1;若有一個(gè)不為1,則為0。

        00111

           11100

        (&或者and)

        ----------------

        00100

      === 2. or運(yùn)算 ===( | )

        or運(yùn)算通常用于二進(jìn)制特定位上的無條件賦值,例如一個(gè)數(shù)or 1的結(jié)果就是把二進(jìn)制最末位強(qiáng)行變成1。如果需要把二進(jìn)制最末位變成0,對(duì)這個(gè)數(shù)or 1之后再減一就可以了,其實(shí)際意義就是把這個(gè)數(shù)強(qiáng)行變成最接近的偶數(shù)。

        相同位只要一個(gè)為1即為1。

        00111

        11100

        (|或者or)

        ----------------

        11111

      === 3. xor運(yùn)算 ===( ^ )

        異或的符號(hào)是⊕。

        xor運(yùn)算通常用于對(duì)二進(jìn)制的特定一位進(jìn)行取反操作,因?yàn)楫惢蚩梢赃@樣定義:0和1異或0都不變,異或1則取反。

        xor運(yùn)算的逆運(yùn)算是它本身,也就是說兩次異或同一個(gè)數(shù)最后結(jié)果不變,即(a xor b) xor b = a。xor運(yùn)算可以用于簡單的加密,比如我想對(duì)我MM說1314520,但怕別人知道,于是雙方約定拿我的生日19880516作為密鑰。1314520 xor 19880516 = 20665500,我就把20665500告訴MM。MM再次計(jì)算20665500 xor 19880516的值,得到1314520,于是她就明白了我的企圖。

        下面我們看另外一個(gè)東西。定義兩個(gè)符號(hào)#和@(xor=⊕),這兩個(gè)符號(hào)互為逆運(yùn)算,也就是說(x # y) @ y = x。現(xiàn)在依次執(zhí)行下面三條命令,結(jié)果是什么?

        相同位不同則為1,相同則為0。

        00111

        11100

        (^或者xor)

        ----------------

        11011

      === 4. not運(yùn)算 ===( ~ )

        not運(yùn)算的定義是把內(nèi)存中的0和1全部取反。使用not運(yùn)算時(shí)要格外小心,你需要注意整數(shù)類型有沒有符號(hào)。如果not的對(duì)象是無符號(hào)整數(shù)(不能表示負(fù)數(shù)),那么得到的值就是它與該類型上界的差,因?yàn)闊o符號(hào)類型的數(shù)是用00到$FFFF依次表示的。下面的兩個(gè)程序(僅語言不同)均返回65435。
        var
        a:word;
        begin
        a:=100;
        a:=not a;
        writeln(a);
        end.
        #include <stdio.h>
        int main()
        {
        unsigned short a=100;
        a = ~a;
        printf( "%d\n", a );
        return 0;
        }
        如果not的對(duì)象是有符號(hào)的整數(shù),情況就不一樣了,稍后我們會(huì)在“整數(shù)類型的儲(chǔ)存”小節(jié)中提到。

      === 5. shl運(yùn)算 ===( << )

        a shl b就表示把a(bǔ)轉(zhuǎn)為二進(jìn)制后左移b位(在后面添b個(gè)0)。例如100的二進(jìn)制為1100100,而110010000轉(zhuǎn)成十進(jìn)制是400,那么100 shl 2 = 400。可以看出,a shl b的值實(shí)際上就是a乘以2的b次方,因?yàn)樵诙M(jìn)制數(shù)后添一個(gè)0就相當(dāng)于該數(shù)乘以2。
        通常認(rèn)為a shl 1比a * 2更快,因?yàn)榍罢呤歉讓右恍┑牟僮鳌R虼顺绦蛑谐艘?的操作請(qǐng)盡量用左移一位來代替。
        定義一些常量可能會(huì)用到shl運(yùn)算。你可以方便地用1 shl 16 - 1來表示65535。很多算法和數(shù)據(jù)結(jié)構(gòu)要求數(shù)據(jù)規(guī)模必須是2的冪,此時(shí)可以用shl來定義Max_N等常量。

      === 6. shr運(yùn)算 ===( >> )

        和shl相似,a shr b表示二進(jìn)制右移b位(去掉末b位),相當(dāng)于a除以2的b次方(取整)。我們也經(jīng)常用shr 1來代替div 2,比如二分查找、堆的插入操作等等。想辦法用shr代替除法運(yùn)算可以使程序效率大大提高。最大公約數(shù)的二進(jìn)制算法用除以2操作來代替慢得出奇的mod運(yùn)算,效率可以提高60%。

      位運(yùn)算的簡單應(yīng)用  
              有時(shí)我們的程序需要一個(gè)規(guī)模不大的Hash表來記錄狀態(tài)。比如,做數(shù)獨(dú)時(shí)我們需要27個(gè)Hash表來統(tǒng)計(jì)每一行、
      每一列和每一個(gè)小九宮格里已經(jīng)有哪些數(shù)了。此時(shí),我們可以用27個(gè)小于2^9的整數(shù)進(jìn)行記錄。
              例如,一個(gè)只填了2和5的小九宮格就用數(shù)字18表示(二進(jìn)制為000010010),而某一行的狀態(tài)為511則表示這一行已經(jīng)填滿。
      需要改變狀態(tài)時(shí)我們不需要把這個(gè)數(shù)轉(zhuǎn)成二進(jìn)制修改后再轉(zhuǎn)回去,而是直接進(jìn)行位操作。在搜索時(shí),
      把狀態(tài)表示成整數(shù)可以更好地進(jìn)行判重等操作。這道題是在搜索中使用位運(yùn)算加速的經(jīng)典例子。以后我們會(huì)看到更多的例子。
        下面列舉了一些常見的二進(jìn)制位的變換操作
                  功能              |               示例                 |         操作
        去掉最后一位                |   (101101->10110)                    |   x shr 1
        在最后加一個(gè)0           |   (101101->1011010)                |   x shl 1
        在最后加一個(gè)1           |   (101101->1011011)                |   x shl 1+1
        把最后一位變成1        |   (101100->101101)                 |   x or 1
        把最后一位變成0        |   (101101->101100)                 |   x or 1-1
        最后一位取反                 |   (101101->101100)                  |   x xor 1
        把右數(shù)第k位變成1         |   (101001->101101,k=3)          |   x or (1 shl (k-1))
        把右數(shù)第k位變成0         |   (101101->101001,k=3)          |   x and not (1 shl (k-1))
        右數(shù)第k位取反            |   (101001->101101,k=3)          |   x xor (1 shl (k-1))
        取末三位                         |   (1101101->101)                      |   x and 7
        取末k位                        |   (1101101->1101,k=5)            |   x and (1 shl k-1)
        取右數(shù)第k位                |   (1101101->1,k=4)                  |   x shr (k-1) and 1
        把末k位變成1              |   (101001->101111,k=4)          |   x or (1 shl k-1)
        末k位取反                        |   (101001->100110,k=4)           |   x xor (1 shl k-1)
        把右邊連續(xù)的1變成0      |   (100101111->100100000)     |   x and (x+1)
        把右起第一個(gè)0變成1      |   (100101111->100111111)     |   x or (x+1)
        把右邊連續(xù)的0變成1      |   (11011000->11011111)         |   x or (x-1)
        取右邊連續(xù)的1                 |   (100101111->1111)                 |   (x xor (x+1)) shr 1
        去掉右起第一個(gè)1的左邊 |   (100101000->1000)     |   x and (x xor (x-1))
        最后這一個(gè)在樹狀數(shù)組中會(huì)用到。
        Pascal和C中的16進(jìn)制表示   
              Pascal中需要在16進(jìn)制數(shù)前加$符號(hào)表示,C中需要在前面加0x來表示。這個(gè)以后我們會(huì)經(jīng)常用到。


      posted on 2011-10-16 19:53  More study needed.  閱讀(1794)  評(píng)論(0)    收藏  舉報(bào)

      導(dǎo)航

      書山有徑勤為路>>>>>>>>

      <<<<<<<<學(xué)海無涯苦作舟!

      主站蜘蛛池模板: 国产熟女一区二区三区蜜臀| 亚洲男人AV天堂午夜在| 色老板精品无码免费视频| 精品综合久久久久久98| 国产国产午夜福利视频| 亚洲国产成人久久精品不卡| 国产免费网站看v片元遮挡| av色蜜桃一区二区三区| 精品一区二区三区蜜桃久| 亚洲av无码成人影院一区| 国产AV巨作丝袜秘书| 精品人妻中文字幕av| 国产一区二区不卡自拍| 午夜福利宅福利国产精品| 成人午夜免费无码视频在线观看| 激情综合五月网| 国产激情一区二区三区成人 | 天天摸夜夜摸夜夜狠狠添| 国产999久久高清免费观看| 国产精品综合在线免费看| 精品少妇后入一区二区三区| 国产精品白浆无码流出| 久久久国产一区二区三区四区小说| 精品国产综合一区二区三区| 国产精品无码av不卡| 宅男噜噜噜66在线观看| 在线亚洲午夜片av大片| 蜜桃av多人一区二区三区| 娇妻玩4p被三个男人伺候| 北条麻妃一区二区三区av高清| 蜜桃一区二区三区免费看| 国产精品中文一区二区| 美女黄18以下禁止观看| 亚洲精品乱码久久久久久按摩高清 | 国产熟睡乱子伦视频在线播放| 日本高清中文字幕免费一区二区| 开心激情站一区二区三区| 久久中文字幕日韩无码视频 | 亚洲高清免费在线观看| 久久综合给合久久狠狠狠88| 岳阳市|