• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            Java中的位操作,位判斷

            Java中的位操作指定包括:
            ~                   
            按位非(NOT
            &                  
            按位與(AND
            |                   
            按位或(OR
            ^                  
            按位異或(XOR
            >>                
            右移
            >>>              
            無符號右移
            <<                
            左移
            前面幾個都非常簡單,主要是移位操作比較容易出錯.

            首先要搞清楚參與運算的數的位數,如int的是32位。long的是64位。
            int i = 1;
            i
            的二進制原碼表示為:
            00000000000000000000000000000001

            long l = 1;
            l
            的二進制原碼表示為:
            0000000000000000000000000000000000000000000000000000000000000001


            二、
            正數沒有反碼、補碼,也可以說正數的反碼、補碼跟原碼一樣。
            負數的反碼為原碼逐位取反,
            int i = -1;
            10000000000000000000000000000001,
            最高位是符號位。正數為0,負數為1
            逐位取反后:
            01111111111111111111111111111110
            即反碼。
            反碼加1
            01111111111111111111111111111111
            即補碼。
            負數都是用補碼參與運算的。得到的也是補碼,需要減1取反獲得原碼。

            三、常用的位運算符--0在位運算中是比較特殊的。
            異或。      相同為0,相異為1   任何數與0異或都等于原值。 
            與。        11 00;  任何數與0異或都等于0。  
            或。        11 00。  任何數與0或都等于原值。
            <<
            左移。      0
            >>
            右移。      符號位是00,是11
            >>>
            無符號右移。補0
                      逐位取反

            四、負數參與的運算,得到的是補碼,需要將補碼先減1,然后逐位取反,得到原碼。即為運算結果。
            0
            例外,如果得到的是0,則不需減1和取反。
            另外,兩個正數運算后得到的就是原碼,不需減1和取反。


            舉例:
            1
            -1,
            -1
            10000000000000000000000000000001--
            原碼
            01111111111111111111111111111110--
            反碼
            01111111111111111111111111111111--
            補碼
            1
            00000000000000000000000000000001--
            原碼

            1^-1等于
            01111111111111111111111111111111^
            00000000000000000000000000000001=
            01111111111111111111111111111110--
            補碼
            01111111111111111111111111111101--
            反碼
            10000000000000000000000000000010--
            原碼==-2
            1^-1=-2

            舉例:
            1^-2
            -2
            10000000000000000000000000000010--
            原碼
            01111111111111111111111111111101--
            反碼
            01111111111111111111111111111110--
            補碼
            1
            00000000000000000000000000000001--
            原碼
            1^-2等于
            01111111111111111111111111111110^
            00000000000000000000000000000001=
            01111111111111111111111111111111--
            補碼
            01111111111111111111111111111110--
            反碼
            10000000000000000000000000000001--
            原碼==-1


            1.<<
            邏輯左移,右邊補0,符號位和其他位一樣.
            正數:
            x<<1
            一般相當于2x,但是可能溢出.
            溢出范圍: 230~(231-1) 二進制表示 010000...00001111....1111,移位后最高為變為1,變成負數了.
            負數:
            x<<1
            一般也相當于2x,也有可能溢出.所以, x*32可以寫成x<<5
            溢出范圍: -231~-(230+1)二進制表示10000...000101111...1111,移位后最高為變成0,變成正數了.

            2.>>
            算術右移,和上面的不對應,為正數時左邊補0,為負數時左邊補1.
            x>>1,
            相當于x/2,余數被舍棄,因為這個是縮小,所以不會溢出.
            不過有一點要注意: -1右移多少位都是-1.
            另外舍棄的余數是正的, 3>>1=1 舍棄的余數是1.
            -3>>1=-2
            舍棄的余數也是1,而不是-1.
            對于正數 x>>1x/2相等
            對于負數 x>>1x/2不一定相等.

            3.>>>
            邏輯右移,這個才是和<<對應的
            這個把符號位一起移動,左邊補0
            對于正數,>>>>>是一樣的
            對于負數,右移之后就變成正數了.

            可以使用Integer.toBinaryString(int i)來看01比特,更加直觀.


            考慮下面的代碼: 
            for (val = 0; val < 100000; val +=5) { alterX = val * 8; myResult = val * 2; }


            用移位操作替代乘法操作可以極大地提高性能。下面是修改后的代碼: 

            for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; }

              修改后的代碼不再做乘以8的操作,而是改用等價的左移3位操作,每左移1位相當于乘以2。相應地,右移1位操作相當于除以2。值得一提的是,雖然移位操作速度快,但可能使代碼比較難于理解,所以最好加上一些注釋。

            posted on 2009-08-03 19:12 肥仔 閱讀(609) 評論(0)  編輯 收藏 引用 所屬分類: Web-后臺

            69久久精品无码一区二区| 久久综合九色综合久99| 久久天堂AV综合合色蜜桃网| avtt天堂网久久精品| 久久久久久噜噜精品免费直播 | 久久er国产精品免费观看2| 久久se精品一区二区影院| 久久久久青草线蕉综合超碰| 久久久一本精品99久久精品88| 99久久综合国产精品二区| 新狼窝色AV性久久久久久| 久久噜噜久久久精品66| 久久亚洲综合色一区二区三区| 久久这里只精品99re66| 国产A三级久久精品| 精品视频久久久久| 国产美女久久久| 精品久久久无码人妻中文字幕| 久久夜色撩人精品国产小说| 久久99国产乱子伦精品免费| 久久香蕉国产线看观看猫咪?v| 久久精品一区二区国产| 亚洲精品午夜国产VA久久成人| 亚洲精品tv久久久久久久久久| 精品一久久香蕉国产线看播放| 久久久中文字幕| 亚洲国产成人久久综合碰碰动漫3d| 国产精品久久自在自线观看| 国内精品人妻无码久久久影院| 色婷婷综合久久久久中文| 久久久久女人精品毛片| 青草国产精品久久久久久| 国内精品九九久久久精品| www.久久99| 九九久久精品无码专区| 久久精品18| 亚洲AⅤ优女AV综合久久久| 久久婷婷五月综合成人D啪| 九九精品久久久久久噜噜| 国内精品综合久久久40p| 丁香色欲久久久久久综合网|