移位運算符和位運算符本質上都是操作二進制位,因為計算機存儲的是二進制數據,運算效率相對較高。
移位運算符:把整數的二進制位進行左移或右移 .左移一位,相當於這個數乘以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 } }