Java的位運算(bitwise operators)直接對整數(shù)類型的位進行操作,這些整數(shù)類型包括long、int、short、char和 byte,位運算符具體如下表:
專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計、成都網(wǎng)站制作服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)嵐山免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了千余家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
左移位(<<)?
程序:
public class LeftMoving{
? ? public static void main(String[] args){
? ? ? ? ? ?System.out.println("5<<3="+(5<<3));
? ? }
}
輸出結(jié)果:?
5<<3=40?
計算過程:?
0000 0000 0000 0000 0000 0000 0000 0101 ? 5?
0000 0000 0000 0000 0000 0000 0010 1000 ? 40
右移位(>>)?
正數(shù)?
程序:
public class PlusRightMoving{
? ? public static void main(String[] args){
? ? ? ? ? ?System.out.println("5>>1="+(5>>1));
? ? }
}
輸出結(jié)果:?
5>>1=2?
計算過程:?
0000 0000 0000 0000 0000 0000 0000 0101 ? 5?
0000 0000 0000 0000 0000 0000 0000 0010 ? 2
負數(shù)?
程序:
public class NegativeRightMoving{
? ? public static void main(String[] args){
? ? ? ? ? ?System.out.println("-5>>1="+(-5>>1));
? ? }
}
輸出結(jié)果:?
-5>>1=-3?
計算過程:?
1111 1111 1111 1111 1111 1111 1111 1011 ? -5?
1111 1111 1111 1111 1111 1111 1111 1101 ? -3
無符號右移位(>>>)?
程序:
public class UnsignedRightMoving{
? ? public static void main(String[] args){
? ? ? ? System.out.println("-5>>>1="+(-5>>>1));
? ? }
}
輸出結(jié)果:?
-5>>>1=2147483645?
計算過程:?
1111 1111 1111 1111 1111 1111 1111 1011 ? -5?
0111 1111 1111 1111 1111 1111 1111 1101 ? 2147483645
補充個Java中的基本數(shù)據(jù)類型的相關(guān)知識。
這里包括了float和double兩個浮點型,在本文中對其不予考慮,因為位運算是針對整型的。進行位操作時,除long型外,其他類型會自動轉(zhuǎn)成int型,轉(zhuǎn)換之后,可接受右操作數(shù)長度為32。進行位運算時,總是先將短整型和字節(jié)型值轉(zhuǎn)換成整型值再進行移位操作的。?
程序:
public class ByteLeftMoving{??
public static void main(String[] args){??
? ? ? ? byte b = 127;??
? ? ? ? System.out.println("b<<3="+(b<<3));??
? ? ? ? System.out.println("(byte)(b<<3)="+(byte)(b<<3));??
? ? }??
}??
輸出結(jié)果:?
b<<3=1016?
(byte)(b<<3)=-8
程序:
public class CharLeftMoving{??
public static void main(String[] args){??
? ? ? ? char c = 'l';??
? ? ? ? System.out.println("c<<3="+(c<<3));??
? ? ? ? System.out.println("(char)(c<<3)="+(char)(c<<3));? ?
? ? }??
}??
輸出結(jié)果:?
c<<3=864?
(char)(c<<3)=?
以上兩個例子全部編譯通過,由此可以看出,當(dāng)byte和char進行移位運算時不會發(fā)生錯誤,并且均按照整型進行計算,當(dāng)計算結(jié)果超出byte或是char所能表示的范圍時則進行相應(yīng)的轉(zhuǎn)換(分別輸出了結(jié)果-8和?)。
位運算中的操作數(shù)?
在進行移位運算時要注意整型和長整型在內(nèi)存中的位數(shù)(整型是32位,長整型是64位),如果移位操作數(shù)超出了該位數(shù)則取模計算,例如:int型數(shù)據(jù)是32位的,如果左移35位是什么結(jié)果??
程序:
public class LeftMoving{??
? ? public static void main(String[] args){??
? ? ? ? ? ?System.out.println("5<<35="+(5<<35));??
? ? }??
}??
輸出結(jié)果:?
5<<35=40?
該結(jié)果與5<<3完全相同。?
無論正數(shù)、負數(shù),它們的右移、左移、無符號右移 32位都是其本身,比如 -5<<32=-5、-5>>32=-5、-5>>>32=-5。?
一個有趣的現(xiàn)象是,把 1 左移 31 位再右移 31位,其結(jié)果為 -1。?
計算過程如下:?
0000 0000 0000 0000 0000 0000 0000 0001?
1000 0000 0000 0000 0000 0000 0000 0000?
1111 1111 1111 1111 1111 1111 1111 1111?
位運算要求操作數(shù)為整數(shù),操作數(shù)不能是字符串也不能是小數(shù)。?
如下列程序:
public class BitMath{??
? ? public static void main(String[] args){??
? ? ? ? String s = "Hello";??
? ? ? ? long l = 99;??
? ? ? ? double d = 1.11;??
? ? ? ? int i = 1;??
? ? ? ? int j = 0;??
? ? ? ? System.out.println("j<
? ? ? ? System.out.println("j< ? ? ? ? System.out.println("i< ? ? ? ? System.out.println("i< ? ? }? ? }?? 由于位運算是二進制運算,不要與一些八進制數(shù)搞混,java中二進制數(shù)沒有具體的表示方法。 public class BitMath{ ? ? public static void main(String[] args){ ? ? ? ? System.out.println("010|4="+(010|4)); ? ? } } 輸出結(jié)果:? 010|4=12? 計算過程:? 0000 0000 0000 0000 0000 0000 0000 1000 ?8? 0000 0000 0000 0000 0000 0000 0000 0100 ?4? 進行“或”計算結(jié)果為:? 0000 0000 0000 0000 0000 0000 0000 1100 ?12? 當(dāng)位運算中遇見負數(shù),必須把它轉(zhuǎn)成補碼(不知道什么是補碼的補習(xí)功課去)再進行計算,而不是使用原碼。? 程序: public class BitMath{ ? ? public static void main(String[] args){ ? ? ? ? try { ? ? ? ? ? ? int x = -7; ? ? ? ? ? ? System.out.println("x>>1="+(x>>1)); ? ? ? ? } catch(Exception e) { ? ? ? ? ? ? System.out.println("Exception"); ? ? ? ? } ? ? } } 輸出結(jié)果:? x>>1=-4? 計算過程:? 1111 1111 1111 1111 1111 1111 1111 1001 ?-7? 1111 1111 1111 1111 1111 1111 1111 1100 ?-4 public class BitMath{?? ? ? public static void main(String[] args){?? ? ? ? ? int i = 1;?? ? ? ? ? int j = -1;?? ? ? ? ? System.out.println("1>>>31="+(i>>>31));? ? ? ? ? ? System.out.println("-1>>31="+(j>>31));? ?? ? ? }? ? }?? 輸出結(jié)果:? 1>>>31=0? -1>>31=-1? 程序: public class BitMath{?? ? ? public static void main(String[] args){? ?? ? ? ? ? int a = 1;?? ? ? ? ? a <<= 31;?? ? ? ? ? a >>= 31;? ? ? ? ? ? a >>= 1;? ? ? ? ?? ? ? ? ? System.out.println("a="+a);?? ? ? ? ? int b = 1;? ? ? ? ? ? b <<= 31;? ?? ? ? ? ? b >>= 31;? ?? ? ? ? ? System.out.println("b="+b);? ? ? ? ? ? int c = 1;? ? ? ? ? ? c >>= 31;? ?? ? ? ? ? c <<= 31;?? ? ? ? ? System.out.println("c="+c);? ?? ? ? }?? }?? 輸出結(jié)果:? a=-1? b=-1? c=0? 計算過程:? 0000 0000 0000 0000 0000 0000 0000 0001 ?a=1? 1000 0000 0000 0000 0000 0000 0000 0000 ?a=a<<31后,這里被當(dāng)作是負數(shù)? 1111 1111 1111 1111 1111 1111 1111 1111 ?a=a>>31后,結(jié)果為-1? 1111 1111 1111 1111 1111 1111 1111 1111 ?a=a>>1后,結(jié)果仍為-1? 0000 0000 0000 0000 0000 0000 0000 0001 ?c=1? 0000 0000 0000 0000 0000 0000 0000 0000 ?c=c>>31后為0? 0000 0000 0000 0000 0000 0000 0000 0000 ?0左移31位仍為0
當(dāng)前文章:Java的位運算(bitwiseoperators)
本文路徑:http://weahome.cn/article/jscsso.html