1.位运算符
<< 左移 : 右边以0填充
>> 带符号右移: 负数前面补1,整数补0
>>>不带符号右移
& 按位与运算
| 按位或运算
^按位异或
~按位取反
^按位异或
/* 演示位运算 << : 左移,右边以0填充 */ public class BitDemo{ public static void main(String[] args){ int i = 3; System.out.println(i << 2); System.out.println(-128 >> 1); System.out.println(-128 >> 2); System.out.println("-----------------"); System.out.println(-128 >>> 1);// System.out.println(-128 >>> 2);// } }
/* 有符号,无符号右移 & : 按位与 | : 按位或 ^ : 按位异或 */ public class BitDemo2{ public static void main(String[] args){ // int i = -128; // System.out.println(i >> 2); // System.out.println(i >>> 2); int min = Integer.MIN_VALUE; // System.out.println(min << 11); // System.out.println(6 & 12);//4 // System.out.println(128 & -1); // System.out.println(0 & -1); // System.out.println(-1 & 0); // System.out.println(6 | 3); // System.out.println(-128 | -1); // System.out.println(-1 | 0); // System.out.println(-1 | -1); // System.out.println(6 ^ 3);//5 // System.out.println(min ^ -1); // System.out.println(~min); // System.out.println(~1);//-2 } }
/* 异或运算的简单应用 1.不使用第三方变量交换两个变量的值 异或运算规律: 两个数异或的结果和其中的一个数再次异或,得到另一个数. 2.简单加密 */ public class BitDemo3{ public static void main(String[] args){ //使用第三方变量交换两个变量的值 // int a = 10; // int b = 20; // System.out.println("交换前 :a = " + a + ",b = " + b); // //定义临时变量 // int temp = a; // a = b; // b = temp; // System.out.println("交换后 :a = " + a + ",b = " + b); //两个数异或的结果和其中任意一个数再次异或,得到另外一个数 // int a = 20; // int b = 10; // System.out.println(a ^ b ^ a);// 相当于 b^a^a 将得到 b //使用异或交换两个变量值 // int a = 10; // int b = 20; // System.out.println("交换前 :a = " + a + ",b = " + b); // a = a ^ b;// // b = a ^ b;//得到的是原来的a // a = a ^ b;//用两个数异或的结果,和原来的a进行异或,得到原来的b // System.out.println("交换后 :a = " + a + ",b = " + b); //使用和的方式交换两个变量 // int a = 10; // int b = 20; // System.out.println("交换前 :a = " + a + ",b = " + b); // a = a + b; // b = a - b; // a = a - b; // System.out.println("交换后 :a = " + a + ",b = " + b); //一条语句交换两个变量的值 // int a = 10; // int b = 20; // System.out.println("交换前 :a = " + a + ",b = " + b); // b = (a + b) - (a = b); // System.out.println("交换后 :a = " + a + ",b = " + b); //简单加密 int m = 2000; int key = 23; m = m ^ key; System.out.println(m); System.out.println(m ^ key); } }
/* 位运算规律 在不发生有效位丢失,和符号位改变的情况下,左移相当于乘以2的n次幂 右移相当于除以2的n次幂 移动的位数超过32.实际移动的位数是和32的余数 */ public class BitDemo4{ public static void main(String[] args){ int i = 128; // System.out.println(i << 23);// // System.out.println(i << 24);// // System.out.println(i << 25);// // System.out.println(i << 32); //32 % 32 == 0 相当于没有移动 // System.out.println(i << 63); //63 % 32 = 31 // System.out.println(i << 56); //56 % 32 == 24 // System.out.println(2 >> 33); //33 % 32 == 1,相当于往右移动一位 // System.out.println(3 >> 32); //相当于没有移动 } }