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 閱讀(1581) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 伊宁县| 乌拉特前旗| 东宁县| 宿迁市| 苗栗县| 莆田市| 景德镇市| 雅江县| 新乡市| 石渠县| 鹰潭市| 尚志市| 汉源县| 田东县| 启东市| 依兰县| 凤冈县| 忻城县| 金山区| 景泰县| 巨野县| 顺平县| 南昌市| 和硕县| 通榆县| 通城县| 玉溪市| 额尔古纳市| 聂荣县| 称多县| 灵丘县| 溧阳市| 闽侯县| 通州市| 依安县| 合肥市| 盘山县| 康平县| 嘉义市| 澄迈县| 如皋市|