位运算

Java中的位运算包括 与、或、非、异或、移位。

Java中的上述运算都是把其他进制转为二进制来运算的。

与:代表按位与,都为1则结果为1,有一个为0则结果为0 ,相当于条件并且

或:按位或,只要有一个为1,则为1,都为0则为0 ,相当于条件或

非:按位取反

异或:相同为0,相反为1

移位:操作数按位左移或右移,其中左移n位相当于原数乘以2的n次幂,右移n位相当于原数除以2的n次幂

下面是具体运算:

public class Wei {

	public static void main(String[] args) {

		// 1、位与( & )
		// 位与:第一个操作数的的第n位于第二个操作数的第n位如果都是1,那么结果的第n为也为1,否则为0
		System.out.println(5 & 3);// 结果为1
		System.out.println(4 & 1);// 结果为0
		
		// 2、位或( | )
		// 第一个操作数的的第n位于第二个操作数的第n位 只要有一个是1,那么结果的第n为也为1,否则为0
		System.out.println(5 | 3);// 结果为7
		
		// 3、位非( ~ )
		// 操作数的第n位为1,那么结果的第n位为0,反之。
		System.out.println(~5);// 结果为-6 
		
		// 4、位异或( ^ )
		// 第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0
		 System.out.println(5 ^ 3);//结果为6 
		
		 // 5、左移( << )
		 // 0000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后,低位补0://
		 // 0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20
		 System.out.println(5 << 2);// 运行结果是20 ,相当于5乘以2的平方
		 
		 // 6、右移( >> ) 高位补符号位
		 // 0000 0000 0000 0000 0000 0000 0000 0101 然后右移2位,高位补0:
		 // 0000 0000 0000 0000 0000 0000 0000 0001
		 System.out.println(5 >> 2);// 运行结果是1, 相当于5除以2的平方
		 
		 // 7、无符号右移( >>> ) 高位补0
		 // 例如 -5换算成二进制后为:0101 取反加1为1011
		 // 1111 1111 1111 1111 1111 1111 1111 1011
		 // 我们分别对5进行右移3位、 -5进行右移3位和无符号右移3位:
		 System.out.println(5 >> 3);// 结果是0
		 System.out.println(-5 >> 3);// 结果是-1
		 System.out.println(-5 >>> 3);// 结果是536870911
		 
	}
}

计算机可识别的为二进制数据,所以在代码中使用位运算会提高编程效率!

比如这个算法题:一个数组中只有一个数会只出现一次,其他所有数都出现两次,如何找出只出现一次的那个数

如果使用嵌套循环的话复杂度高,效率慢,但是用异或就可以,首先要明确异或运算a^b^a^b=(a^a)^(b^b);

public class Test {

	public static Integer findOnlyNum1(int[] array){  
	    int result = 0;  
	    for(int i = 0 ;i<array.length;i++){  
	        result^=array[i];  
	        System.out.println(result);
	    }  
	    return result;  
	}  
	
	public static void main(String[] args) {
		int[] array = {1,2,1,3,3,2,4,5,5,6,4,6,9,7,7,8,8};
		System.out.println("result="+findOnlyNum1(array));
	}
}

在比如下面这个例子:

如何找出一个正整数二进制中1的个数

首先要明白任何正整数和1按位与,那么只是正整数二进制的最后一位和1相与,例如5&1 即为 0101&0001=0001 结果为1

	public static int BitCount1(int n){
	    int c =0 ; // 计数器
	    for (c =0; n >0; n >>=1) // 循环移位
	        c += n &1 ; // 如果当前位是1,则计数器加1
	    return c ;
	}
	
	public static void main(String[] args) {
		// 5的二进制为 0101, 结果为2
		System.out.println("result="+BitCount1(5));
	}





                
内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索局部开发之间实现平衡。文章详细解析了算法的初始化、勘探开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOAMOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值