Jafe Lee

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            49 隨筆 :: 0 文章 :: 24 評論 :: 0 Trackbacks
          移位操作要注意的問題是高(低)位是補0還是補1和對char, byte, short型的操作:
          (1)<< : (left-shift), 最低位補0
          (2)>> : (signed right-shift), 右移過程使用符號位擴展(sign extension),即如果符號為為1則高位補1,? 是0則補0,也就是邏輯右移
          (3)>>> : (unsigned right-shit),右移過程使用零擴展(zero extension),即最高位一律補0,也就是算術右移
          (4) 移位操作的數據類型可以是byte, char, short, int, long型,但是對byte, char, short進行操作時會先把它們變成一個int型,最后得到一個int型的結果,對long型操作時得到一個long型結果,不可以對boolean型進 行操作。
          (5)移位操作符可以和=合并起來,即 <<= 、 >>= 和 >>>=。例如 a >>= 2; 表示將a右移兩位后的值重新賦給a。當時在使用這三個操作符對 byte, char, short型數據進行操作時要注意,例如有一下代碼片段:
          public?class?ShiftTest
          {
          ????
          public?static?void?main(String?[]?args)
          ????{
          ????????
          byte?a;
          ????????
          byte?b;
          ????????
          byte?c;
          ????????a?
          =?127;
          ????????b?
          =?127;
          ????????c?
          =?127;
          ????????a?
          <<=?2;
          ????????System.out.println(a);
          ????????System.out.println(b?
          <<=?2);
          ????????System.out.println(c?
          <<?2);
          ????}
          }
          ????
          運行結果是:
          ??? ??? ??? -4
          ??? ?? ?? ? -4
          ??? ?? ?? ?? 508
          這 說明了在操作a <<= 2 執行過程是這樣的:先將 byte型的數 127變成int型,左移2位得到 508,然后把508賦給byte型變量a時只是簡單地"折斷"(truncate)得到數-4。編譯時編譯器不會提示你可能損失精度(實際上在本例中確 實是損失精度了),但是如果你把a <<= 2改成 a = a << 2;編譯器就會提示可能損失精度了。
          posted on 2007-05-22 17:17 Jafe Lee 閱讀(1588) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 定兴县| 大厂| 德昌县| 左云县| 屏东市| 锦屏县| 枝江市| 天峻县| 石楼县| 上栗县| 清远市| 望城县| 墨竹工卡县| 竹山县| 谷城县| 上林县| 博爱县| 沂水县| 明溪县| 永安市| 怀来县| 南涧| 福泉市| 武陟县| 齐河县| 广宗县| 眉山市| 荣成市| 喀喇沁旗| 泽库县| 邓州市| 安康市| 泗水县| 长宁县| 永和县| 吉水县| 滨州市| 安岳县| 苍溪县| 大邑县| 蓝田县|