国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Java的移位運(yùn)算符

2019-11-17 05:56:13
字體:
供稿:網(wǎng)友
移位運(yùn)算符面向的運(yùn)算對象也是二進(jìn)制的“位”。可單獨(dú)用它們處理整數(shù)類型(主類型的一種)。左移位運(yùn)算符(<<)能將運(yùn)算符左邊的運(yùn)算對象向左移動運(yùn)算符右側(cè)指定的位數(shù)(在低位補(bǔ)0)。“有符號”右移位運(yùn)算符(>>)則將運(yùn)算符左邊的運(yùn)算對象向右移動運(yùn)算符右側(cè)指定的位數(shù)。“有符號”右移位運(yùn)算符使用了“符號擴(kuò)展”:若值為正,則在高位插入0;若值為負(fù),則在高位插入1。java也添加了一種“無符號”右移位運(yùn)算符(>>>),它使用了“零擴(kuò)展”:無論正負(fù),都在高位插入0。這一運(yùn)算符是C或C++沒有的。
  若對char,byte或者short進(jìn)行移位處理,那么在移位進(jìn)行之前,它們會自動轉(zhuǎn)換成一個int。只有右側(cè)的5個低位才會用到。這樣可防止我們在一個int數(shù)里移動不切實(shí)際的位數(shù)。若對一個long值進(jìn)行處理,最后得到的結(jié)果也是long。此時只會用到右側(cè)的6個低位,防止移動超過long值里現(xiàn)成的位數(shù)。但在進(jìn)行“無符號”右移位時,也可能碰到一個問題。若對byte或short值進(jìn)行右移位運(yùn)算,得到的可能不是正確的結(jié)果(Java 1.0和Java 1.1非凡突出)。它們會自動轉(zhuǎn)換成int類型,并進(jìn)行右移位。但“零擴(kuò)展”不會發(fā)生,所以在那些情況下會得到-1的結(jié)果。可用下面這個例子檢測自己的實(shí)現(xiàn)方案:
  //: URShift.java
  // Test of unsigned right shift
  public class URShift {
   public static void main(String[] args) {
    int i = -1;
    i >>>= 10;
    System.out.PRintln(i);
    long l = -1;
    l >>>= 10;
    System.out.println(l);
    short s = -1;
    s >>>= 10;
    System.out.println(s);
    byte b = -1;
    b >>>= 10;
    System.out.println(b);
   }
  } ///:~
  移位可與等號(<<=或>>=或>>>=)組合使用。此時,運(yùn)算符左邊的值會移動由右邊的值指定的位數(shù),再將得到的結(jié)果賦回左邊的值。
  下面這個例子向大家闡示了如何應(yīng)用涉及“按位”操作的所有運(yùn)算符,以及它們的效果:
  //: BitManipulation.java
  // Using the bitwise Operators
  import java.util.*;
  public class BitManipulation {
   public static void main(String[] args) {
    Random rand = new Random();
    int i = rand.nextInt();
    int j = rand.nextInt();
    pBinInt("-1", -1);
    pBinInt("+1", +1);
    int maXPos = 2147483647;
    pBinInt("maxpos", maxpos);
    int maxneg = -2147483648;
    pBinInt("maxneg", maxneg);
    pBinInt("i", i);
    pBinInt("~i", ~i);
    pBinInt("-i", -i);
    pBinInt("j", j);
    pBinInt("i & j", i & j);
    pBinInt("i j", i j);
    pBinInt("i ^ j", i ^ j);
    pBinInt("i << 5", i << 5);
    pBinInt("i >> 5", i >> 5);
    pBinInt("(~i) >> 5", (~i) >> 5);
    pBinInt("i >>> 5", i >>> 5);
    pBinInt("(~i) >>> 5", (~i) >>> 5);
    long l = rand.nextLong();
    long m = rand.nextLong();
    pBinLong("-1L", -1L);
    pBinLong("+1L", +1L);
    long ll = 9223372036854775807L;
    pBinLong("maxpos", ll);
    long lln = -9223372036854775808L;
    pBinLong("maxneg", lln);
    pBinLong("l", l);
    pBinLong("~l", ~l);
    pBinLong("-l", -l);
    pBinLong("m", m);
    pBinLong("l & m", l & m);
    pBinLong("l m", l m);
    pBinLong("l ^ m", l ^ m);
    pBinLong("l << 5", l << 5);
    pBinLong("l >> 5", l >> 5);
    pBinLong("(~l) >> 5", (~l) >> 5);
    pBinLong("l >>> 5", l >>> 5);
    pBinLong("(~l) >>> 5", (~l) >>> 5);

   }
   static void pBinInt(String s, int i) {
    System.out.println(
     s + ", int: " + i + ", binary: ");
    System.out.print("  ");
    for(int j = 31; j >=0; j--)
     if(((1 << j) & i) != 0)
      System.out.print("1");
     else
      System.out.print("0");
    System.out.println();
   }
   static void pBinLong(String s, long l) {
    System.out.println(
     s + ", long: " + l + ", binary: ");
    System.out.print("  ");
    for(int i = 63; i >=0; i--)
     if(((1L << i) & l) != 0)
      System.out.print("1");
     else
      System.out.print("0");
    System.out.println();
   }
  } ///:~
  程序末尾調(diào)用了兩個方法:pBinInt()和pBinLong()。它們分別操作一個int和long值,并用一種二進(jìn)制格式輸出,同時附有簡要的說明文字。目前,可暫時忽略它們具體的實(shí)現(xiàn)方案。
  大家要注重的是System.out.print()的使用,而不是System.out.println()。print()方法不會產(chǎn)生一個新行,以便在同一行里羅列多種信息。
  除展示所有按位運(yùn)算符針對int和long的效果之外,本例也展示了int和long的最小值、最大值、+1和-1值,使大家能體會它們的情況。注重高位代表正負(fù)號:0為正,1為負(fù)。下面列出int部分的輸出:
  -1, int: -1, binary:
    11111111111111111111111111111111
  +1, int: 1, binary:
    00000000000000000000000000000001
  maxpos, int: 2147483647, binary:
    01111111111111111111111111111111
  maxneg, int: -2147483648, binary:
    10000000000000000000000000000000
  i, int: 59081716, binary:
    00000011100001011000001111110100
  ~i, int: -59081717, binary:
    11111100011110100111110000001011
  -i, int: -59081716, binary:
    11111100011110100111110000001100
  j, int: 198850956, binary:
    00001011110110100011100110001100
  i & j, int: 58720644, binary:
    00000011100000000000000110000100
  i j, int: 199212028, binary:
    00001011110111111011101111111100
  i ^ j, int: 140491384, binary:
    00001000010111111011101001111000
  i << 5, int: 1890614912, binary:
    01110000101100000111111010000000
  i >> 5, int: 1846303, binary:
    00000000000111000010110000011111
  (~i) >> 5, int: -1846304, binary:
    11111111111000111101001111100000
  i >>> 5, int: 1846303, binary:
    00000000000111000010110000011111
  (~i) >>> 5, int: 132371424, binary:
    00000111111000111101001111100000
  數(shù)字的二進(jìn)制形式表現(xiàn)為“有符號2的補(bǔ)值”。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 依兰县| 兰溪市| 南陵县| 云龙县| 长兴县| 吕梁市| 五家渠市| 新乡县| 蓬溪县| 万安县| 含山县| 英吉沙县| 建德市| 双江| 浮梁县| 宝清县| 五常市| 铁岭市| 潜山县| 高淳县| 迁西县| 德昌县| 镇平县| 高要市| 泽普县| 临洮县| 波密县| 临邑县| 崇礼县| 将乐县| 临城县| 灌南县| 碌曲县| 台前县| 兴安县| 全州县| 安图县| 古交市| 大化| 高阳县| 沙坪坝区|