您的位置:首页 > 编程语言 > Java开发

Java-赋值运算符-逻辑运算符-位运算符-异或应用

2016-07-10 14:35 399 查看
赋值运算符

package basis.day02;
/**
* 赋值运算符: = += -= *= /= %=
* += -=等等既可以完成运算,又不改变运算对象的数据类型。
* @author LENOVO
*
*/
public class TestAss {

public static void main(String[] args){

int i = 10; // = 是一个赋值运算符,将10赋值给i
i += 2; //i = i + 2 同时i的数据类型不会发生改变
System.out.println(i);

int i1 = 12;
i1 += 1.5;      //这里虽然1.5是double,但是将其强转为int型(范围大的转范围小的,截取)
System.out.println(i1);

int i2 = 13;
i2 /= 3;
System.out.println(i2);

double i3 = 13;
i3 /= 3;
System.out.println(i3);
}
}


逻辑运算符

package basis.day02;
/**
* 逻辑运算符 & && | || ^ !
* @author LENOVO
*
*/
public class TestLogic {

public static void main(String[] args){

boolean a = true;
boolean b = false;

System.out.println(a & b);  //&(与)      false
System.out.println(a && b); //&&(短路与)   false
System.out.println(a | b);  //| (或)     true
System.out.println(a || b); //||(短路或)   true
System.out.println(a^b);    //^ (异或)    true 异或:不同为true,相同为false
System.out.println(!a);     //! (非)     false

int i = 10;
int j = 10;
/*
* &与短路&&
* 对于&&,若左端为false,右端不进行运算
* 对于&,无论左端是false还是true,右端都进行运算
*/

if(b && ++i > 0){
System.out.println("早上好");
}else{
System.out.println("中午好");
}
System.out.println(i);             //10

if(b & ++j > 0){
System.out.println("早上好");
}else{
System.out.println("中午好");
}
System.out.println(j);            //11

/*
* |与||
* ||若左端为true,右端不进行运算
* |无论左端为true或者false,右端都要进行运算
*/
int ii = 2;
int jj = 2;

if(a || ++ii > 0){
System.out.println("下午好");
}else{
System.out.println("晚上好");
}
System.out.println(ii);              //2

if(a | ++jj > 0){
System.out.println("下午好");
}else{
System.out.println("晚上好");
}
System.out.println(jj);             //3
}
}


位运算符

package basis.day02;
/**
* 位运算符 << >> >>> & | ^ ~
* @author LENOVO
*
*/
public class TestBit {

public static void main(String[] args){

/*
* << 左移运算符(左移一位相当于乘以二(末尾补0))
* 注意:左移位数不能太多,超出类型范围
*/
int i = 12;
i = i << 2;
System.out.println(i);  //48

int ii = -12;
ii = ii << 2;
System.out.println(ii); //-48

/*
* >> 右移运算符(右移一位相当于除以二(符号位是什么补什么))
* >>>  无符号右移运算符(不管正负都补0)
* 对于正数,>>和>>>结果一致
* 对于负数,>>和>>>结果不一致
*/

int j = 12;
j = j >> 2;
System.out.println(j);  //3

//j = j >>> 2;
//System.out.println(j);    //3

int jj = -12;
//jj = jj >> 2;
//System.out.println(jj);       //-3

jj = jj >>> 2;
System.out.println(jj);     //1073741821

/*
* 位运算指的都是二进制位
* &两个操作数的每一位进行与运算
* |两个操作数的每一位进行或运算
* ^两个操作数的每一位进行异或运算
* ~操作数按位取反
*/
int a = 12;
int b = 5;
System.out.println(a & b);  //4
System.out.println(a | b);  //13
System.out.println(a ^ b);  //9
System.out.println(~ b);   //-6 注意按位取反包括符号位
}
}


异或应用

package basis.day02;
/**
* 异或的重要用途:转换m,n的值
* @author LENOVO
*
*/
public class TestXor {

public static void main(String[] args){
/*
* 交换m,n的值
*/
int m = 12;
int n = 5;

/*
* 方法一:设置一个中间变量temp
*/
//System.out.println("m = " + m + " n = " + n);
//System.out.println("交换");
//int temp ;
//temp = m;
//m = n;
//n = temp;
//System.out.println("m = " + m + " n = " + n);

/*
* 叠加,再减。缺点不能计算过大的数
*/
//System.out.println("m = " + m + " n = " + n);
//System.out.println("交换");
//m = m + n;
//n = m - n;
//m = m - n;
//System.out.println("m = " + m + " n = " + n);

/*

* 利用异或的特性
* 两个相同的数进行异或(因为每一位都相同)得0,0与任何数异或还是这个数(0,1异或得1;0,0异或得0)
* 因此三个数进行异或(其中有两个相同的数)结果为不同于其他两个的数
*/
System.out.println("m = " + m + " n = " + n);
System.out.println("交换");

m = m ^ n;
n = m ^ n;  //(m^n)^n
m = n ^ m;  //n^(m^n)   n已经改变为m的值(12)(因此表达式最后结果是n的值赋值给m)

System.out.println("m = " + m + " n = " + n);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: