前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法篇:位运算基本操作

算法篇:位运算基本操作

作者头像
灰子学技术
发布2020-09-23 15:33:22
2330
发布2020-09-23 15:33:22
举报
文章被收录于专栏:灰子学技术灰子学技术

算法:

本章介绍位操作的基本操作,具体操作见下面的几类具体题目:

代码语言:javascript
复制
异或操作,与操作,或操作和偏移操作

题目1: 计算位1的个数

https://leetcode-cn.com/problems/number-of-1-bits/

代码实现:

代码语言:javascript
复制
func hammingWeight(num uint32) int {
   count := 0
   for i := 0; i < 32; i++ {
     if num&(1<<i) != 0 {
         count++
     }
   }
   return count
}
// 算法: 
// 利用单个bit上面的 a&1=1 表示a=1;a&1=0 表示a=0

执行结果:

题目2:2的幂

https://leetcode-cn.com/problems/power-of-two/

代码实现:

代码语言:javascript
复制
func isPowerOfTwo(n int) bool {
    if n == 0 {
        return false
    }
    return n&(n-1) ==0
}
// 算法:
// 2的幂转换成二进制,如下图所示,所以可以利用n&(n-1) == 0 来判断
// 0000 0001  ->1
// 0000 0010  ->2 
// 0000 0100  ->4
// 0000 1000  ->8
// 0001 0000  ->16
// 0010 0000  ->32
// 0100 0000  ->64
// 1000 0000  ->128

执行结果:

题目3: 两个整数的和

https://leetcode-cn.com/problems/sum-of-two-integers/

代码实现:

代码语言:javascript
复制
func getSum(a int, b int) int {
    // b作为进位,当为0的时候,说明计算结束
    for b != 0 {
    sum := a ^ b // 不进位的加法
    carry := (a & b) << 1 // 计算进位
    a = sum
    b = carry
  }
  return a
}
// 算法:
// 1. 异或操作,a^b 得到的结果,a+b不进位的和的数值
// 2. 与操作,a&b向右偏移1位,表示的就是进位数值
// 3. 循环操作,直到进位数为0,表示计算结束了。

执行结果:

题目4:

https://leetcode-cn.com/problems/swap-numbers-lcci/

代码实现:

代码语言:javascript
复制
func swapNumbers(numbers []int) []int {
    numbers[0] ^= numbers[1]
    numbers[1] ^= numbers[0]
    numbers[0] ^= numbers[1]
    return numbers
}
// 算法:
// 交换a,b,位操作步骤:a ^=b; b ^= a; a ^= b;

执行结果:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 灰子学技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档