Java计算处理一日谈

Java运算

温故而知新,可以为师矣。
今天温习Java运算。
从分类上来说,Java运算分为位运算、算术运算、赋值运算、关系运算、逻辑运算、三元运算/三目运算。
实际可以进一步抽离为两种,位运算与非位运算instanceof(非位运算)。也就是算术、赋值、关系、逻辑、三目其实都是基于位运算延伸而来,具体原因各位看官听我慢慢道来。

1.位运算

“>>” 有符号右移
"<<"有符号左移
“>>>” 无符号右移
"<<<"无符号左移

对于计算机而言,所有运算都是基于补码计算(原码、反码、补码)。而这些计算方式的实现,对于计算机而言,采用位运算是最快也是最高效的方式。
注意,以下案例以整数为例子,考虑到浮点数表示和计算的复杂度,这里以整数为例。在计算机的补码中,正整数的原码、反码、补码是一致的,负数则需要先转为原码,再转为补码,再转为反码。计算机都是采用补码进行计算。

有符号右移
/* 
右移相当于除以2的次方,移动几位就是除以2的几次方。
正数右移,左侧不足的位补0;负数右移,左侧不足的位补1
int 是四个字节表示,也就是32位。
1byte=1字节=8bit
1bit=1位(0或者1)
正数,原码、反码、补码合一;负数则需要转换
所有计算都是以补码形式进行
*/
int a = 6;
a = a>>2;
/*
右移2位,相当于除以2的2次方,除以4,6除以4=1。
正整数的加减乘除注意结果都是正整数,没有四舍五入的说法。
a 原码/反码/补码                    0000 0000 0000 0000 0000 0000 0000 0110
右移2位,末尾四位的0110的10就去掉了 0000 0000 0000 0000 0000 0000 0000 0001 
除以的结果,显而易见,就是1             
*/
有符号左移
/*
左移,相当于乘以2的次方,左移几位就是乘以2的几次方
这里是有符号左移,相当于-100乘以2的三次方,结果是-800
计算机的计算以补码形式进行
负数的补码需要先转为原码,也就是正常的二进制,
反码就是除了最首位的符号位之外全部取反,
补码就是反码基础上最末尾加1的结果
*/
int b = -100;
b = b<<3;
/*
b的原码     1000 0000 0000 0000 0000 0000 0110 0100‬
b的反码     1111 1111 1111 1111 1111 1111 1001 1011
b的补码     1111 1111 1111 1111 1111 1111 1001 1100
左移三位    1111 1111 1111 1111 1111 1100 1110 0000
最右侧因为左移,空出来三个位置,补0即可
得出来的补码,转为反码
            1111 1111 1111 1111 1111 1100 1101 1111  
转为原码    1000 0000 0000 0000 0000 0011 0010 0000
首位符号位1,负数
0011 0010 0000转为整数就是800,-800,和规则下计算结果一致			
*/
无符号右移
/*
无符号右移,就是不管正负数,右移时,左侧空出来的位置都补0;
无符号左移,就是不管正负数,左移时,右侧空出来的位置都补0;
*/
int c = -60;
c >>> 2
/*
c的原码 1000 0000 0000 0000 0000 0000 0011 1100
c的反码 1111 1111 1111 1111 1111 1111 1100 0011
c的补码 1111 1111 1111 1111 1111 1111 1100 0100
补码无符号右移2位
        0011 1111 1111 1111 1111 1111 1111 0001
注意这里符号位已经是0,整数,直接换算,不再需要转为反码,再转原码。
1073741809
*/

2.算术运算

“+”
“-”
“*”
“/”
“%”
“++”
“–”

class Test7 {
	public static void main(String[] args) {
		/*
		int c = -60;
		c = c >>> 2;
		System.out.println(c);
		*/
		int a = 10;
		int b = 20;
		int ch1 = 30;
		int ch2 = 40;
		int ch3 = 50;
		int ch4 = 60;

		int c = a+b;
		int d = a-b;
		
		int e = a*b;
		int f = a/b;
		
		int g = a%b;
		
		int h = ch1++;
		int i = ++ch2;
		
		int j = ch3--;
		int k = --ch4;
		
		System.out.println(c);
		System.out.println(d);
		System.out.println(e);
		System.out.println(f);
		System.out.println(g);
		System.out.println(h);
		System.out.println(i);
		System.out.println(j);
		System.out.println(k);
		/*
		30
		-10
		200
		0
		10
		30
		41
		50
		59
		*/
	}
}
/*
这里的加减乘除等运算,其实就是位运算的另外一种形式,例如加法就是2个数做加法位运算,逐一比较每个位,逢二进一就是结果。减法是另一种加法,除法和乘法就是左移和右移。++和--就是对自己做递增递减。
求余比较特殊,当针对2的次方数如4 8 16 32等做求余时,其实就相当于对这个数做右移,右移走的那个数就是余数。但这种算法只针对这种场景,其他场景有单独的计算方式来处理,并不是位运算来实现的了。
*/

3.赋值运算

“=”
“+=”
“-=”
“*=”
“/=”
“%=”

class Test7 {
	public static void main(String[] args) {
		
		int a = 5;
		int b = 10;
		int c = 20;
		int d = 30;
		int e = 40;
		int f = 50;
		
		a += 5;
		b -= 2;
		c -= 4;
		d *= 9;
		e /=8;
		f %= 5;
		
		System.out.println(a);
		System.out.println(b);
		System.out.println(c);
		System.out.println(d);
		System.out.println(e);
		System.out.println(f);
		/*
		10
		8
		16
		270
		5
		0
		*/
	}
}
/*
显而易见,这些赋值运算其实也是由位运算扩展而来的
*/

4.关系运算

==
!=
<
<=

=
instanceof

class Test7 {
	public static void main(String[] args) {
		int a = 9;
		int b = 100;
		String str = "a ha";
		
		System.out.println(a == b);
		System.out.println(a != b);
		System.out.println(a < b);
		System.out.println(a <= b);
		System.out.println(a > b);
		System.out.println(a >= b);
		System.out.println(str instanceof String);
		/*
		false
		true
		true
		true
		false
		false
		true
		*/
	}
}
/*
这些关系运算,涉及到数字对比,布尔运算的,最终也是转为位运算处理。
*/

5.逻辑运算

&
|
^
!
&&
||

class Test7 {
	public static void main(String[] args) {
		int a = 100;
		int b = 900;
		int c = -30;
		
		// 这里是针对逻辑运算,&(并且)、|(或者)、!(逻辑取反)
		System.out.println(a<b & a<c);
		System.out.println(a<b | a<c);
		System.out.println( !(a<b) );
		// 逻辑运算中的短路符号,也就是如果前一个条件如果符合要求,后一个条件可以不执行,会被短路掉。
		// 例如&&如果第一个条件为假,则第二个条件可以不处理,因为整体肯定是假
		// 例如||如果第一个条件为真,则第二个条件可以不处理,整体肯定为真
		System.out.println(a<b && a<c);
		System.out.println(a<b || a<c);
		
		// 这里针对数字的位操作,&(按位与,注意如果是int就是32位,全是1则为1),|(有一个为1,则为1,否则为0),^(2者不一致为1,一致为0)
		System.out.println(a & b);
		System.out.println(a | b);
		System.out.println(a ^ b);
		/*
		false
		true
		false
		false
		true
		4
		996
		992
		*/
	}
}
/*
这里的运算,区分针对逻辑还是针对数字做位运算,但2者本质还是基于位运算做的扩展。
*/

6.三元运算

? :
这本身就是一种逻辑运算,不过是特殊的符号,所以单独列出。
例如:

class Test7 {
	public static void main(String[] args) {
		int age = 30;
		int salary = (age > 40)? 30000 :20000;
		System.out.println(salary);
		
	}
}
/*
代码可知,这里其实就是组合起来的逻辑判断而已
*/

计算机和程序最开始的目的就是应用在军事和科学上的数据计算,例如 弹道计算,所以对于计算能力的支持是每一门编程语言都会考虑的,只是不同编程语言侧重点不同。
有的语言就是专门开发科学计算,这方面能力会非常完善,甚至自带很多现成公式和方法计算支持,而一些语言则需要通过类库或者第三方库来支持。

综上所述,Java语言作为一门现代化语言,对计算的支持是从语言层面做了支持的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值