java基础-位运算符

时间:2023-03-10 04:53:35
java基础-位运算符

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); //相当于没有移动 }
}