算法学习——位运算的一些技巧

位运算符

与(&)|(或)、 ^(异或)、~ (非/取反)

>>和<<运算符将二进制位进行右移或者左移操作

>>>运算符将用0填充高位; >>运算符用符号位填充高位,没有<<<运算符

对于int型,1<<35与1<<3是相同的,而左边的操作数是long型时需对右侧操作数模64

与:都为1结果为1,或:有一个为1结果为1,异或:二者不同时结果为1

位运算的一些技巧

1、判断奇偶数

X&1或者X&0判断,二进制数的第一位的数为1则为奇数,否则为偶数。

2、获取二进制某一位是0还是1

将1左移到该位后与运算。

3、交换两个整数变量的值

a = a ^ b;
b = a ^ b;
a = a ^ b;

4、不用判断语句,求整数的绝对值

num * (1 - ((num >>> 31)<<1))

异或:可以理解为不进位加法: 1+1=0 , 0+0=0 , 1+0=1

性质:
1、交换律可任意交换运算因子的位置,结果不变

2、结合律(即(a^b)^c == a^(b^c) )

3、对于任何数x ,都有x^x=0 , x^0=x ,同自己求异或为0 ,同0求异或为自己

4、自反性A^B^B=A^0=A , 连续和同一个因子做异或运算,最终结果为自己

 

练习题:找出唯一成对的数

1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复, 其它均只出现一次。每个数组元素只能访问一
次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?

思路:利用异或的自反性,相同的数的异或值为0,任何数与0异或为它本身。将1-1000这1000个数都与它本身异或一次后,再与剩下的这个数异或,得出的值就是唯一一个重复的数。

例如:1、2、2、3、4、5存放在a[6]中,遍历异或得出某值x。在将1、2、3、4、5存放在b[5]中,遍历异或得出某值y。再运算x^y(可以看成1^2^3^4^5^1^2^2^3^4^5,即1^1^2^2^2^3^3^4^4^5^5)得出重复的值为2。

代码如下:

public class reNum {
	public static void main(String[] args) {
		int N = 1001;
		int[] arr = new int[N];
		for (int i = 0; i < arr.length-1; i++) {
			arr[i] = i+1;
		}
		arr[arr.length-1] = 1+(int)(Math.random()*(N-1));//随机生成1~N-1中的某个数
		for (int i = 0; i < N; i++) {
			System.out.print(arr[i]+",");
		}
		System.out.println();
		//计算1~N-1的异或值
		int cnt = 0;
		for (int i = 1; i <= N - 1; i++) {
			cnt = (cnt^i);
		}
		//计算arr[N]与1~N-1的异或值,即重复的数
		for (int i = 0; i < N; i++) {
			cnt = cnt^arr[i];
		}
		System.out.println(cnt);
	}
}


 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值