日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

[轉(zhuǎn)]java中char,byte,short的移位操作

系統(tǒng) 2372 0

在Think in Java中有這么一段話“ 對char,byte或者short進(jìn)行移位處理,那么在移位進(jìn)行之前,它們會自動轉(zhuǎn)換成一個int。只有右側(cè)的5個低位才會有用。這樣可防止我們在一個int數(shù)里移動不切實際的位數(shù)。若對一個long值進(jìn)行處理,最后得到的結(jié)果也是long。此時只會用到右側(cè)的6個低位,防止移動超過long值里現(xiàn)成的位數(shù) 。”

?

對上面那段話的理解是:移位操作符操作的運(yùn)算對象是二進(jìn)制的“位”,int類型是32位也就是2的5次冪 !如果移32位以上,那么原來的數(shù)的信息會全部丟失,這樣也就沒有什么意義了!所以上面的“只有右側(cè)的5個低位才會有用”說的是: 移位操作符右端的那個數(shù)(化成二進(jìn)制)的低5位才有用,即 ? X < <y; ?? 是指y的低5位才有用,即不能大于32 。 而對于long型也是同樣的道理!

因此,如果對一個int 型,進(jìn)行移位,X < <y; 當(dāng)y小于32時,移位后的結(jié)果一般都在我們的預(yù)料當(dāng)中;而如果y大于32時, 由于移位超出了int所能表示的范圍,這時就先把y化成二進(jìn)制數(shù),然后取該二進(jìn)制數(shù)右端的低5位(相當(dāng)于&11111或者是除32得到的余數(shù)),再把這5位化成十進(jìn)制,此時的這個十進(jìn)制就是要對X移動的位數(shù)。

例如:????????

                                     int i = 1245;
		String s = Integer.toBinaryString(i);
		int y1 = i>>2;
		String s1 = Integer.toBinaryString(y1);
		int y2 = i>>34;
		String s2 = Integer.toBinaryString(y2);
		System.out.println(i + "->" + s + "  " + y1 + "->" + s1 + "  " + y2 + "->" + s2);
  
語句“ int y2 = i>>34;”的執(zhí)行過程是:先把i化成二進(jìn)制數(shù):10011011101

?執(zhí)行結(jié)果:

    1245->10011011101  311->100110111  311->100110111
  

?

執(zhí)行語句 i>> 34?? 對i右移34位時,先把34化成二進(jìn)制:100010,對該二進(jìn)制數(shù)取右邊5位,即00010,化成十進(jìn)制數(shù)為2,所以實際上是對i右移兩位。現(xiàn)在,結(jié)果是:100110111

?

?

long型數(shù)據(jù)移位時一樣的道理,long型一共64位,如果移動的位數(shù)超過64(2^8)就沒有意義了,所以在移位前判斷移動的位數(shù)是否大于64,如果大于了64則取該位數(shù)的低8位(除以64得到的余數(shù)),再移位,否則直接移位。

移位運(yùn)算符和按位運(yùn)算符一樣,同屬于位運(yùn)算符,因此移位運(yùn)算符的位指的也是二進(jìn)制位。它包括以下幾種:
左移位(<<):將操作符左側(cè)的操作數(shù)向左移動操作符右側(cè)指定的位數(shù)。移動的規(guī)則是在二進(jìn)制的低位補(bǔ)0。

  1. 有符號右移位(>>):將操作符左側(cè)的操作數(shù)向右移動操作符右側(cè)指定的位數(shù)。移動的規(guī)則是,如果被操作數(shù)的符號為正,則在二進(jìn)制的高位補(bǔ)0;如果被操作數(shù)的符號為負(fù),則在二進(jìn)制的高位補(bǔ)1。
  2. 無符號右移位(>>>):將操作符左側(cè)的操作數(shù)向右移動操作符右側(cè)指定的位數(shù)。移動的規(guī)則是,無論被操作數(shù)的符號是正是負(fù),都在二進(jìn)制位的高位補(bǔ)0。


注意,移位運(yùn)算符不存在“無符號左移位(<<<)”一說。與按位運(yùn)算符一樣, 移位運(yùn)算符可以用于byte、short、int、long等整數(shù)類型,和字符串類型char,但是不能用于浮點數(shù)類型float、double ;當(dāng)然,在Java5.0及以上版本中,移位運(yùn)算符還可用于byte、short、int、long、char對應(yīng)的包裝器類。我們可以參照按位運(yùn)算符的示例寫一個測試程序來驗證,這里就不再舉例了。
與按位運(yùn)算符不同的是,移位運(yùn)算符不存在短路不短路的問題。
寫到這里就不得不提及一個在面試題中經(jīng)常被考到的題目:

引用
請用最有效率的方法計算出2乘以8等于幾?


這里所謂的最有效率,實際上就是通過最少、最簡單的運(yùn)算得出想要的結(jié)果,而移位是計算機(jī)中相當(dāng)基礎(chǔ)的運(yùn)算了,用它來實現(xiàn)準(zhǔn)沒錯了。 左移位“<<”把被操作數(shù)每向左移動一位,效果等同于將被操作數(shù)乘以2,同理,無符號右移位">>>"把被操作數(shù)每向右移動一位,效果等同于將被操作數(shù)除以2, 而2*8=(2*2*2*2),就是把2向左移位3次。因此最有效率的計算2乘以8的方法就是“2<<3”。

最后,我們再來考慮一種情況,當(dāng)要移位的位數(shù)大于被操作數(shù)對應(yīng)數(shù)據(jù)類型所能表示的最大位數(shù)時,結(jié)果會是怎樣呢?比如,1<<35=?呢?
這里就涉及到移位運(yùn)算的另外一些規(guī)則:

  1. byte、short、char在做移位運(yùn)算之前,會被自動轉(zhuǎn)換為int類型,然后再進(jìn)行運(yùn)算。
  2. byte、short、int、char類型的數(shù)據(jù)經(jīng)過移位運(yùn)算后結(jié)果都為int型。
  3. long經(jīng)過移位運(yùn)算后結(jié)果為long型。
  4. 在左移位(<<)運(yùn)算時,如果要移位的位數(shù)大于被操作數(shù)對應(yīng)數(shù)據(jù)類型所能表示的最大位數(shù),那么先將要求移位數(shù)對該類型所能表示的最大位數(shù)求余后,再將被操作數(shù)移位所得余數(shù)對應(yīng)的數(shù)值,效果不變。比如1<<35=1<<(35%32)=1<<3=8。
  5. 對于有符號右移位(>>)運(yùn)算和無符號右移位(>>>)運(yùn)算,當(dāng)要移位的位數(shù)大于被操作數(shù)對應(yīng)數(shù)據(jù)類型所能表示的最大位數(shù)時,那么先將要求移位數(shù)對該類型所能表示的最大位數(shù)求余后,再將被操作數(shù)移位所得余數(shù)對應(yīng)的數(shù)值,效果不變。。比如100>>35=100>>(35%32)=100>>3=12。


下面的測試代碼驗證了以上的規(guī)律:

Java代碼 ? 復(fù)制代碼
  1. public ? abstract ? class ?Test?{ ??
  2. ???? public ? static ? void ?main(String[]?args)?{ ??
  3. ????????System.out.println( "1?<<?3?=?" ?+?( 1 ?<<? 3 )); ??
  4. ????????System.out.println( "(byte)?1?<<?35?=?" ?+?(( byte )? 1 ?<<?( 32 ?+? 3 ))); ??
  5. ????????System.out.println( "(short)?1?<<?35?=?" ?+?(( short )? 1 ?<<?( 32 ?+? 3 ))); ??
  6. ????????System.out.println( "(char)?1?<<?35?=?" ?+?(( char )? 1 ?<<?( 32 ?+? 3 ))); ??
  7. ????????System.out.println( "1?<<?35?=?" ?+?( 1 ?<<?( 32 ?+? 3 ))); ??
  8. ????????System.out.println( "1L?<<?67?=?" ?+?(1L?<<?( 64 ?+? 3 ))); ??
  9. ???????? //?此處需要Java5.0及以上版本支持 ? ??
  10. ????????System.out.println( "new?Integer(1)?<<?3?=?" ?+?( new ?Integer( 1 )?<<? 3 )); ??
  11. ????????System.out.println( "10000?>>?3?=?" ?+?( 10000 ?>>? 3 )); ??
  12. ????????System.out.println( "10000?>>?35?=?" ?+?( 10000 ?>>?( 32 ?+? 3 ))); ??
  13. ????????System.out.println( "10000L?>>>?67?=?" ?+?(10000L?>>>?( 64 ?+? 3 ))); ??
  14. ????} ??
  15. }??


運(yùn)行結(jié)果:

  1. 1 << 3 = 8
  2. (byte) 1 << 35 = 8
  3. (short) 1 << 35 = 8
  4. (char) 1 << 35 = 8
  5. 1 << 35 = 8
  6. 1L << 67 = 8
  7. new Integer(1) << 3 = 8
  8. 10000 >> 3 = 1250
  9. 10000 >> 35 = 1250
  10. 10000L >>> 67 = 1250

轉(zhuǎn)自: http://blog.csdn.net/chattie/archive/2009/03/27/4029922.aspx

[轉(zhuǎn)]java中char,byte,short的移位操作


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 石渠县| 鱼台县| 华蓥市| 井研县| 惠来县| 上林县| 苍山县| 普定县| 元阳县| 乡城县| 樟树市| 牙克石市| 康平县| 西畴县| 简阳市| 洪洞县| 贵阳市| 卓资县| 武陟县| 固原市| 濉溪县| 潢川县| 拜泉县| 朔州市| 静乐县| 高雄县| 读书| 清原| 乡宁县| 周宁县| 阳东县| 名山县| 集安市| 崇礼县| 永宁县| 武山县| 沾化县| 辉南县| 澄迈县| 三明市| 西充县|