• <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 肥仔 閱讀(603) 評論(0)  編輯 收藏 引用 所屬分類: Web-后臺

            久久精品国产亚洲AV蜜臀色欲| 久久久久久久综合日本| 欧洲成人午夜精品无码区久久| 成人午夜精品无码区久久| 国产一区二区三区久久| 色婷婷久久综合中文久久一本| 国内精品综合久久久40p| 久久久久综合网久久| 99久久国产亚洲综合精品| 久久夜色精品国产噜噜亚洲AV| 青青青青久久精品国产| 国色天香久久久久久久小说 | 久久人人爽人人爽人人爽| 97久久久精品综合88久久| 热RE99久久精品国产66热| 国产精品久久网| 成人午夜精品无码区久久| 久久久无码精品午夜| 久久91精品久久91综合| 囯产极品美女高潮无套久久久| 久久精品国产色蜜蜜麻豆| 国产精品久久国产精麻豆99网站| 久久午夜无码鲁丝片秋霞| 久久人人爽人爽人人爽av| 99久久国产免费福利| 久久国产精品久久| 国内精品久久久久久久97牛牛 | 久久亚洲AV无码精品色午夜麻豆| 93精91精品国产综合久久香蕉| 亚洲中文久久精品无码| 伊人久久久AV老熟妇色| 一本久久免费视频| 麻豆久久久9性大片| 久久中文字幕视频、最近更新 | 精品无码久久久久久久动漫| 国产一级做a爰片久久毛片| 国内精品久久久久影院免费| 久久精品国产只有精品2020| 国产成人无码久久久精品一| AV狠狠色丁香婷婷综合久久| 久久精品国产亚洲AV高清热|