java 簡單認識移位運算符和位運算符


移位運算符和位運算符本質上都是操作二進制位,因為計算機存儲的是二進制數據,運算效率相對較高。

移位運算符:把整數的二進制位進行左移或右移 .左移一位,相當於這個數乘以2, 右移一位,相當於這個數除以2

/*
移位運算符
    把整數的二進制位進行左移或右移
    按位左移 <<    , 右側補0,
    按位右移 >>,  左側補符號位(最高位)
    無符號按位右移>>>,  左側補0
*/
class Demo07 {
    public static void main(String[] args)     {
        int xx = 20;
        System.out.println( xx << 1 );        //40
        /* x在內存中的二進制形式為:
            0000 0000 0000 0000 0000 0000 0001 0100
            xx<<1 左移一位
          0 0000 0000 0000 0000 0000 0000 0010 1000         
        */

        System.out.println( xx >> 1 );        //10
        /* x在內存中的二進制形式為:
            0000 0000 0000 0000 0000 0000 0001 0100
            xx>>1 右移一位, 左側補0
            0000 0000 0000 0000 0000 0000 0000 1010 0        
        */

        xx = -20;
        System.out.println( xx << 1 );        //-40
        /* x在內存中的二進制形式為:
            1111 1111 1111 1111 1111 1111 1110 1100
            xx<<1 左移一位
          1 1111 1111 1111 1111 1111 1111 1101 1000        
        */
        System.out.println( xx >> 1 );        //-10
        /* x在內存中的二進制形式為:
            1111 1111 1111 1111 1111 1111 1110 1100
            xx>>1 右移一位, 左側補1
            1111 1111 1111 1111 1111 1111 1111 0110        
        */

        //左移一位,相當於這個數乘以2, 右移一位,相當於這個數除以2

        xx = -11;
        System.out.println( xx << 1 );        //-22
        /* x在內存中的二進制形式為:
            1111 1111 1111 1111 1111 1111 1111 0101
            xx<<1 左移一位
          1 1111 1111 1111 1111 1111 1111 1110 1010        
        */

        xx = -13;
        System.out.println( xx << 1 );        //-26
        /* x在內存中的二進制形式為:
            1111 1111 1111 1111 1111 1111 1111 0011
            xx<<1 左移一位, 右側補0 
          1 1111 1111 1111 1111 1111 1111 1110 0110        
        */

        xx = -11;
        System.out.println( xx >> 1 );        //-6
        /* x在內存中的二進制形式為:
            1111 1111 1111 1111 1111 1111 1111 0101
            xx>>1 右移一位, 左側補1
            1111 1111 1111 1111 1111 1111 1111 1010 1        
        */

        xx = -13;
        System.out.println( xx >> 1 );        //-7
        /* x在內存中的二進制形式為:
            1111 1111 1111 1111 1111 1111 1111 0011
            xx>>1 右移一位, 左側補1
            1111 1111 1111 1111 1111 1111 1111 1001 1        
        */

        xx = -11;
        System.out.println( xx >>> 1 );        //2147483642
        /* x在內存中的二進制形式為:
            1111 1111 1111 1111 1111 1111 1111 0101
            xx>>>1 無符號移一位
            0111 1111 1111 1111 1111 1111 1111 1010 1        
        */

        //一個整數乘以/除以2的冪次方時,通過移位運算效率最高
    }
}

位運算符:

  按位與 & 按位或 |  按位異或 ^  

/*
位運算符
	按位與&, 按位或|, 按位異或^, 按位取反
	
	&操作符左右兩側如果是布爾值, &就是邏輯與;
	左右兩側為整數,就是按位與
*/
class Demo08 {
	public static void main(String[] args) 	{
		int x = 10;
		int y = 20;
		/*按位與
			x在計算機中存儲的01序列為:
				0000 0000 0000 0000 0000 0000 0000 1010
			y的二進制形式為:
				0000 0000 0000 0000 0000 0000 0001 0100
		按位與&
			----------------------------------------------
				0000 0000 0000 0000 0000 0000 0000 0000
		*/
		System.out.println( x&y );			//0

		/*按位或
			x在計算機中存儲的01序列為:
				0000 0000 0000 0000 0000 0000 0000 1010
			y的二進制形式為:
				0000 0000 0000 0000 0000 0000 0001 0100
		按位或|
			----------------------------------------------
				0000 0000 0000 0000 0000 0000 0001 1110
		*/
		System.out.println( x|y );			//30

		/*按位異或
			x在計算機中存儲的01序列為:
				0000 0000 0000 0000 0000 0000 0000 1010
			y的二進制形式為:
				0000 0000 0000 0000 0000 0000 0001 0100
		按位異或^
			----------------------------------------------
				0000 0000 0000 0000 0000 0000 0001 1110
		*/
		System.out.println( x^y );			//30

		/*按位取反
			x在計算機中存儲的01序列為:
				0000 0000 0000 0000 0000 0000 0000 1010			
		按位取反
			----------------------------------------------
				1111 1111 1111 1111 1111 1111 1111 0101
		*/
		System.out.println( ~x );			//-11

		// 如何實現兩個數的原地交換,  不借助於第三個變量,實現兩個變量的交換
		x = 10;
		y = 20;
		//正常情況下,交換兩個變量的值
		int t = x;
		x = y; 
		y = t;

		//方法1:
		x = 10;
		y = 20;
		x = x + y;		//x==30
		y = x - y;		//y==10
		x = x - y;		//x==20

		//方法2:
		x = 10;
		y = 20;
		x = x ^ y;		//x==30
		y = x ^ y;		//y==10
		x = x ^ y;		//x==20

	
	}
}

  

 

      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM