Java学习笔记(二)位运算符和逻辑运算符

位运算符和逻辑运算符

位运算符我们在编程的过程中也许用得很少,但位运算符的速度极快,使用得当会为程序运行速度带来极大提升。
左移<<和右移>>运算符可以帮助我们解决乘除2的次方数这是我们都知道的,异或运算符是相同为假不同为真,&&和||称为短路与和短路或,意味着当某一条件可以判断整个式子最终的真假时它不会继续判断下去。请开始他们的表演٩(๑>◡<๑)۶

case1

LeetCode上面有一道题:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。要求不使用额外空间

case2

这是一道听起来很简单但是要求很苛刻的题,我从一个公众号上面看到的:求1到100的累加和,不能使用循环和判断以及乘除,也就是说类似for,if,while,switch还有三元运算符都不能用。

case3

求两个整数之和(int型就够用了),但不能使用±*/
给大家一点思考时间~
------------------------------------------------------------------------------------------------------------------------我是一条分割线

case1解答

留心一下题目我们很容易发现一个点,就是,题目很明确地说,只有一个元素出现了一次,其他都是两次,两次,这个很重要。异或是相同为假不同为真,这也就是说,两个相同的数异或得0,而0和任何数异或都得该数,所以用疑惑来解决该题是最简单不过的了

class Solution {
    public int singleNumber(int[] nums) {
        int ret = nums[0];
	    for(int i = 1; i < nums.length; i++)
	        ret ^= nums[i];
        return ret;
    }
}
case2解答

不让用循环,那就用递归好了,但是,慢着客官,您递归终止的条件是什么?咱可是不能用判断的关键字的。这时候就是短路运算符出场的时候了

public int addadd(int n){
	int sum=n;
	boolean t=(n!=0)&&(sum+=addadd(n-1))!=0;
	return sum;
}

我们设置的布尔型变量t只是为了让它递归,当n等于0时此条件为真,短路与会忽略后面的函数递归,从而达到终止递归的效果,

case3解答

不用说就是位运算符大显身手的时候了

public int twonumber(int num1,int num2){
	int tmp=0;
	while(num1!=0){
		tmp=num1^num2;
		num1=(num1&num2)<<1;
		num2=tmp;
	}
	return num2;
}

这里也用到了异或,我们试验一下异或运算符,可以很容易发现异或运算只是把两个二进制各位相加,只是没有进位,那么要算a+b,各位相加算出来了,进位怎么算呢?a&b<<1其实就是第一位相加产生的进位,在代码中,当num1等于0说明已经没有进位了不需要再向高一位加进位。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值