Java学习笔记—运算符

1.逻辑运算符

1.1逻辑运算符的基本用法

逻辑运算符的种类:

种类用法
&(并且)运算两端同时为true最终结果才为true
|(或者)运算两端同时为false最终结果才为false
!(非)运算的结果取相反值,原来为true,运算完为false;原来为false,运算完为true
^ (异或)相同为false,不同为true
&&(短路与)和 &(并且)最终的运算结果上,是没有区别的,只是在运算效率上有区别
||(短路或)和 |(或者)最终的运算结果上,是没有区别的,只是在运算效率上有区别

逻辑运算符一般用于连接boolean类型的表达式或者值。
注意
在Java中我们要表示一个数大于3并且小于6 ,不可以写成3<x<6,应该写成 x>3 & x<6 。
除此之外还要注意一点,当我们表示一个变量的倍数是,比如x的三倍,不应该写成3x,二十应该写成3*x。

1.2&和&&的区别

它们在最终的运算结果上,是没有区别的,只是在运算效率上有区别。
&运算两端的表达式都会执行;
&&当左端的表达式为false时,右端的表达式就不执行了。只有当左边的表达式为true时,才运算右边的表达式。
因为当左端的值为false时,可以决定整体这个表达式的最终结果。而左端的值位true时不能决定最终结果。
如下面的程序:

class Test{
	public static void main(String[] args) {
		int a=10;
		int b=20;
		boolean f=a>b&a++>11;
		System.out.println("f:"+f);
		System.out.println("a:"+a);
	}
}

观察这段程序,当使用&将 f=a>b和a++>11两个表达式连接起来的时候, f=a>b的值是false,就可以判断这个语句用&连接起来的结果也是false,但是它仍然执行了后面的a++>11。看下面的结果:
在这里插入图片描述
但是继续看下面这段程序,仅仅把运算符从&换成了&&,结果便截然不同。

class Test{
	public static void main(String[] args) {
		int a=10;
		int b=20;
		boolean f=a>b&&a++>11;
		System.out.println("f:"+f);
		System.out.println("a:"+a);
	}
}

运行的结果为:
在这里插入图片描述
这一次没有执行a++>11,因为当左端的值为false时,可以决定整体这个表达式的最终结果。所以就不需要执行右端的语句了。

1.3|和||的区别

|和||的区别和上面&和&&相似
它们在最终的运算结果上,是没有区别的,只是在运算效率上有区别。
|运算两端的表达式都会执行;
||当左端的表达式为true时,右端的表达式就不执行了。只有当左边的表达式为false时,才运算右边的表达式。
因为当左端的值为true时,可以决定整体这个表达式的最终结果。而左端的值位false时不能决定最终结果。

2.位运算符

2.1位运算符的种类

种类作用
&(与)有0则0
|(或)有1则1
^ (异或)相同则0,不同则1
~(按位取反)0变1,1变0,符号位也要取反
<<(左移)空位补0,被移除的高位丢弃
>>(右移)被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,高位补1。
>>>(无符号右移)被移位二进制最高位无论是0或者是1,空缺位都用0补。

举例:
1&2

0 0000001 补码
0 0000010 补码
——————————
0 0000000 补码

1|2
0 0000001 补码
0 0000010 补码
——————————
0 0000011 补码

~1
0 000 0001(此时是补码,按位取反)
1 111 1110(此时是补码,求原码)
1 000 0010 (原码)
从补码到原码符号位不变,所以我们看到1按位取反之后变成了-2.

重中之重:
切记:位运算是补码的运算,如果运算前如果是正数就可以直接运算,如果是负数,一定要换成补码,然后再进行运算。运算完结果仍是补码,我们要换成原码。如果结果是正数,结果就等于原码,如果是负数,就要将补码换成原码。

2.2位异或运算符的特点

(1)一个数被另一个数位异或两次该数不变。
a^b^b=a;
利用这个特点我们还可以进行值交换,下面我们会提及。
(2)自己和自己位异或结果是0。
a^a=0;

2.3左移、右移运算符的特点

<< : 把<<左边的数据乘以2的移动次幂 例如 10<<3 结果 10*2^3=80
>> : 把>>左边的数据除以2的移动次幂 例如 40>>3 结果 40/2^3=5

3.值交换的几种方式

方式1:采用中间变量进行值的交换
t=a;
a=b;
b=t;

方式2:采用位异或来进行值的交换(一个数被另一个数位异或两次该数不变)
a=a^b;
b=a^b; //b=a^b^b;
a=a^b;//a=a^b^a;

方式3:
a=a+b;
b=a-b;//b=a+b-b=a
a=a-b;//a=a+b-a=b

方式4:
a=(a+b)-(b=a);

4.三元运算符

格式:表达式?值1:值2;
当表达式的结果为true时,返回值1,为false时,返回值2;

比较三个数,输出最大的数;

class  Test{
	public static void main(String[] args) {
		int a=20,b=10,c=100;
	    int max;
		max=(a>b?a:b)>c?(a>b?a:b):c;
		System.out.println(max);
	}
}

在这里插入图片描述

三元运算符可以嵌套,但是要注意代码的阅读性,不建议嵌套,这样比较复杂。

5.键盘录入

(1)为什么要使用键盘录入数据
a:为了让程序的数据更符合开发的数据。
b:让程序更灵活一下。

(2)如何实现键盘录入呢?
a:导包
格式:
import java.util.Scanner;
位置:
在class上面。
b:创建键盘录入对象
格式:
Scanner sc = new Scanner(System.in);
c:通过对象获取数据
格式:
int x = sc.nextInt();

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
import cv2 as cv import numpy as np """"" cv2.cornerHarris() 可以用来进行角点检测。参数如下: • img - 数据类型为 float32 的输入图像。 • blockSize - 角点检测中要考虑的领域大小。 • ksize - Sobel 求导中使用的窗口大小 • k - Harris 角点检测方程中的自由参数,取值参数为 [0,04,0.06] """"" src_inital = cv.imread("E:/opencv/picture/building.jpg") src = cv.cvtColor(src_inital,cv.COLOR_BGR2GRAY) src = np.float32(src) dst = cv.cornerHarris(src,3,3,0.04) #R值是由det(M)-K(trace(M))*(trace(M)),当该点是角点时,该点所对应的R值就会很大,通过设置对R的阈值,就可以筛选得到角点 #这里的dst就是R值构成的灰度图像,灰度图像坐标会与原图像对应,R值就是角点分数,当R值很大的时候 就可以认为这个点是一个角点 print(dst.shape) src_inital[dst>0.08*dst.max()]=[0,0,255] """"" src_inital[dst>0.08*dst.max()]=[0,0,255] 这句话来分析一下 dst>0.08*dst.max()这么多返回是满足条件的dst索引值,根据索引值来设置这个点的颜色 这里是设定一个阈值 当大于这个阈值分数的都可以判定为角点 dst其实就是一个个角度分数R组成的,当λ1和λ2都很大,R 也很大,(λ1和λ2中的最小值都大于阈值)说明这个区域是角点。 那么这里为什么要大于0.08×dst.max()呢 注意了这里R是一个很大的值,我们选取里面最大的R,然后只要dst里面的值大于百分之八的R的最大值  那么此时这个dst的R值也是很大的 可以判定他为角点,也不一定要0.08可以根据图像自己选取不过如果太小的话 可能会多圈出几个不同的角点 """"" cv.imshow("inital_window",src_inital) cv.waitKey(0) cv.destroyAllWindows() 目标: 理解Harris角点检测的概念 使用函数cv2.cornerHarris(),cv2.cornerSubPix() 原理: Harris 角点检测的方法大概原理就是建立一个窗口区域,然后以当前窗口为中心向各个方向进行偏移。 如上图所示,第一个窗口向各个方向偏移的时候,像素值没有变化,因为窗口偏移的时候没有遇到任何边缘信息。 第二个图,窗口当中有一个直线(即block是在边缘上),如果当前窗口进行上下的移动,也没有像素值发生变化(在其他方向上灰度值也会变化)。 第三个图,窗口覆盖了一个“拐角”,如果窗口进行偏移,任何方向上都会有像素变化。 所以,第三张图片判断为检测到角点。 判断特征点是否为角点的依据:R只与M值有关,R为大数值正数时特征点为角点,R为大数值负数时为边缘,R为小数值时为平坦区 寻找R位于一定阈值之上的局部最大值,去除伪角点。 方向导数IxIx和IyIy可以使用cv2.Sobel()函数得到 Harris角点检测的结果是灰度图,图中的值为角点检测的打分值。需要选取合适的阈值对结果进行二值化来检测角点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值