位运算

判断奇偶数

通用做法:

if n % 2 == 1 {
	// n 是个奇数
}

可以使用:

if n & 1 == 1 {
	// n 是个奇数
}
交换两个数
temp := x
x = y
y = temp
// 不使用额外的辅助变量完成交换
x = x ^ y   // (1)
y = x ^ y   // (2)
x = x ^ y   // (3)

推导:
对于(2),y = x^y = (xy)y = x(yy) = x^0 = x。 x 的值成功赋给了 y。
对于(3),x = x^y = (xy)x = (xx)y = 0^y = y。

两个相同的数异或之后结果会等于 0,即 n ^ n = 0。并且任何数与 0 异或等于它本身,即 n ^ 0 = n。
异或运算支持运算的交换律和结合律

找出没有重复的数

给你一组整型数据,这些数据中,其中有一个数只出现了一次,其他的数都出现了两次,让你来找出一个数 。

  1. 每次存储的时候,记录 某个数出现的次数,最后再遍历哈希表,看看哪个数只出现了一次。这种方法的时间复杂度为 O(n),空间复杂度也为 O(n)了。

  2. 把这些数全部异或一下,出现了两次的数异或之后会变成0,那个出现一次的数,和 0 异或之后就等于它本身。

func find(arr []int) int {
tmp := arr[0]
	for  (i := 1; i< len(arr), i++){
		tmp = tmp ^ arr[i]
	}
	return tmp
}

时间复杂度为 O(n),空间复杂度为 O(1)

2的n次方
找出不大于N的最大的2的幂指数

时间复杂度是 O(logn)

int findN(int N){
    int sum = 1;
   while(true){
        if(sum * 2 > N){
            return sum;
        }
        sum = sum * 2;
   }
}

参考:

  1. https://mp.weixin.qq.com/s/H5LIRjCVzlMKy-RrfKbFmA
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值