1. 程式人生 > >java 簡單認識移位運算符和位運算符

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

demo code 情況下 二進制 操作符 認識 class 簡單 ==

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

移位運算符:把整數的二進制位進行左移或右移 .左移一位,相當於這個數乘以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

	
	}
}

  

      

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