算术运算、位运算与三目运算

1. 算术运算符

1.四则运算

四则运算:+,-,* ,/
隐含强制类型转换的四则运算:+=,-=,*= ,/=

测试代码如下:

/**
 * 编译失败
 * short类型参与运算会先转换为int类型,最终结果也是int类型
 * 将int类型的结果赋给short类型,会产生编译错误
 */
short a = 1;
a = a+1;
/**
 * 隐含强制类型转换
 * b+=1 <=> b=(short)(b+1)
 */
short b = 1;
b+=1;
System.out.println(b);      //2

2. 取余运算

%、%=

测试代码如下:

int a = 10 % 3;
//10%3=1
System.out.println("10%3=" + a);

int b = 10;
b %= 3;
//10%3=1
System.out.println("10%3=" + b);

3. 自增/自减运算

++,–

测试代码如下:

/**
 * 自增自减运算符
 * 如果在变量前边(如:--a),先加/减后用,在运算中,当前变量值先加/减一,再进行运算
 * 如果在变量后边(如:a++),先用后加减,在运算中,先进行运算,当前变量值再加/减一
 */
int a = 10;
int b = 10;
int c = 10;
a = b++;    //此时a=10,b=11,c=10
c = --a;    //此时a=9,b=11,c=9
b = ++a;    //此时a=10,b=10,c=9
a = c--;    //此时a=9,b=11,c=8
//最终结果为:a=9,b=10,c=8
System.out.println("最终结果为:a=" + a + ",b=" + b + ",c=" + c);

2. 位运算符

位运算:&、|、~、^
移位运算:<<、>>、>>>
位运算符左右两边是数据时,做位运算;
位运算符左右两边是布尔值(true/false)时,做逻辑运算

1. 两个数据做位运算

&(位与运算): 有0则0,无0即1
|(位或运算): 有1则1,无1即0
~(按位取反运算): 0变1,1变0
^(位异或运算): 相同则0,不同为1

测试代码如下:(点击补充原反补码的知识)

/**
 * 正数的原码、反码、补码相同
 * 3的补码:00000000 00000000 00000000 00000011(int类型)
 * 4的补码:00000000 00000000 00000000 00000100(int类型)
 * 3 & 4原(反/补)码:00000000 00000000 00000000 00000000
 * 结果为0
 */
int a = 3 & 4;
/**
 * 正数的原码、反码、补码相同
 * 3的补码:00000000 00000000 00000000 00000011(int类型)
 * 4的补码:00000000 00000000 00000000 00000100(int类型)
 * 3 | 4原(反/补)码:00000000 00000000 00000000 00000111
 * 结果为7
 */
int b = 3 | 4;
/**
 * 3的补码:00000000 00000000 00000000 00000011(int类型)
 * ~3补码:11111111 11111111 11111111 11111100
 * ~3反码:11111111 11111111 11111111 11111011(符号位不变,补码减1)
 * ~3原码:10000000 00000000 00000000 00000100(符号位不变,其余位取反)
 * 结果为-4
 */
int c = ~3;
/**
 * 正数的原码、反码、补码相同
 * 3的补码:00000000 00000000 00000000 00000011(int类型)
 * 4的补码:00000000 00000000 00000000 00000100(int类型)
 * 3 ^ 4原(反/补)码:00000000 00000000 00000000 00000111
 * 结果为7
 */
int d = 3 ^ 4;
System.out.println(a);    //0
System.out.println(b);    //7
System.out.println(c);    //-4
System.out.println(d);    //7

2. 异或的特点

一个数据对另一个数据异或两次,该数本身不变
a ^b ^b = a
b ^a ^a = b

测试代码如下:

/**
 * 实现两个整数变量数值的交换
 */
int a = 10;
int b = 20;
//方式一
int temp = a;
a = b;
b = temp;
System.out.println("a=" + a + ",b=" + b);  //此时a=20,b=10
//方式二
a = (a + b) - (b = a);
System.out.println("a=" + a + ",b=" + b);  //此时a=10,b=20
//方式三
a = a ^ b;
b = a ^ b;   //此时b = a ^ b ^ b = a;
a = a ^ b;   //此时a = a ^ b ^ a = b;
System.out.println("a=" + a + ",b=" + b);  //此时a=20,b=10
//方式四
a = a + b;
b = a - b;
a = a - b;
System.out.println("a=" + a + ",b=" + b);  //此时a=10,b=20

3. 两个数据做移位运算

<<(左移位运算): 左边最高位舍弃,右边补齐0(a<<b=a*2^b
>>(右移位运算): 最高位为0,左边补齐0;最高位为1,左边补齐1(a>>b=a/2^b
>>>(无符号右移位运算): 无论最高位是0还是1,左边补齐0

测试代码如下:

/**
 * 3<<2 = 3*2^2 = 12 
 * 正数的原码、反码、补码相同
 * 3的补码:00000000 00000000 00000000 00000011(int类型)
 * 3<<2:(00)000000 0000000 00000000 00000011 00
 * 结果为12
 */
int a = 3<<2;
/**
 * -24>>2 = -24/2^2 = -6
 * -24的原码:10000000 00000000 00000000 00011000(int类型)
 * -24的反码:11111111 11111111 11111111 11100111(符号位不变,其余位按位取反)
 * -24的补码:11111111 11111111 11111111 11101000(符号位不变,反码加1)
 * -24>>2:11 11111111 11111111 11111111 111010(00)(补码)
 *         11111111 11111111 11111111 11111001(反码)
 * 		   10000000 00000000 00000000 00000110(原码)
 * 结果为-6
 */
int b = -24>>2;
/**
 * 3<<2 = 3*2^2 = 12 
 * -24的原码:10000000 00000000 00000000 00011000(int类型)
 * -24的反码:11111111 11111111 11111111 11100111(符号位不变,其余位按位取反)
 * -24的补码:11111111 11111111 11111111 11101000(符号位不变,反码加1)
 * -24>>>2:00 11111111 11111111 11111111 111010(00)(原反补码相同)
 * 无符号右移位运算后,结果为正数,原反补码相同			
 * 结果为1073741818
 */
int c = -24>>>2;
/**
 * 24的补码:00000000 00000000 00000000 00011000(原反补码相同)
 * 24>>>2:00 00000000 00000000 00000000 000110(00)(原反补码相同)	
 * 结果为6
 */
int d = 24>>>2;
System.out.println(a);   //12
System.out.println(b);   //-6
System.out.println(c);   //1073741818
System.out.println(d);   //6

3. 三目运算符

结果 = 条件表达式 ? 表达式1 : 表达式2;
如果条件表达式满足(结果为true),则结果取表达式1
如果条件表达式不满足(结果为false),则结果取表达式2

测试代码如下:

/**
 * 使用三目运算符获取两个整数中的较大值:
 * max = a > b ? a : b;
 * 使用三目运算符获取三个整数中的最大值
 */
int a = 12;
int b = 24;
int c = 6;
int max = (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c);
//a、b、c中的最大值为:24
System.out.println("a、b、c中的最大值为:" + max);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值