面试问题浓缩总结 面试问题浓缩总结
  • Go
  • Java
  • C/C++
  • JavaScript/HTML
  • MySQL
  • Redis
  • MongoDB
  • 操作系统
  • 计算机网络
  • spring全家桶
  • mybatis
  • 中间件
  • 软件相关
  • 系统相关
  • 算法
  • 数据结构
  • 设计模式
  • CMU硕士经典100题
  • 剑指offer
  • 重点手撕代码
  • 程序员面试金典
  • 3月
  • 4月
  • 智力题
  • 业务问题
  • 一些技术
  • 安全相关
APP下载 (opens new window)
GitHub (opens new window)
  • Go
  • Java
  • C/C++
  • JavaScript/HTML
  • MySQL
  • Redis
  • MongoDB
  • 操作系统
  • 计算机网络
  • spring全家桶
  • mybatis
  • 中间件
  • 软件相关
  • 系统相关
  • 算法
  • 数据结构
  • 设计模式
  • CMU硕士经典100题
  • 剑指offer
  • 重点手撕代码
  • 程序员面试金典
  • 3月
  • 4月
  • 智力题
  • 业务问题
  • 一些技术
  • 安全相关
APP下载 (opens new window)
GitHub (opens new window)
  • 算法

  • 数据结构

  • 设计模式

  • CMU硕士经典100题

    • 贪心算法
    • 双指针法
    • 二分查找
    • 各种排序
    • 各种搜索
    • 动态规划
    • 分治法解题
    • 数学问题
    • 位运算
      • 位运算的常用技巧
      • 基础问题
        • 汉明距离
        • 颠倒二进制位
        • 只出现一次的数字
      • 二进制特性
        • 4的幂
        • 最大单词长度乘积
        • 比特位计数
    • 数据结构
    • 字符串
    • 链表
    • 树
    • 图
    • 更加复杂的数据结构
  • 剑指offer

  • 重点手撕代码

  • 程序员面试

  • CodeTop企业题库

  • 笔试题目

  • 算法和数据结构
  • CMU硕士经典100题
小游
2021-03-24

位运算

# 位运算的常用技巧

位运算是算法题里比较特殊的一种类型,它们利用二进制位运算的特性进行一些奇妙的优化 和计算。常用的位运算符号包括:“∧”按位异或、“&”按位与、“|”按位或、“∼”取反、“<<” 算术左移和“>>”算术右移。以下是一些常见的位运算特性,其中 0s 和 1s 分别表示只由 0 或 1 构成的二进制数字。

image-20210325201312662

除此之外,n & (n - 1) 可以去除 n 的位级表示中最低的那一位,例如对于二进制表示 11110100 ,减去 1 得到 11110011,这两个数按位与得到 11110000。n & (-n) 可以得到 n 的位级表示中最低 的那一位,例如对于二进制表示 11110100,取负得到 00001100,这两个数按位与得到 00000100。

# 基础问题

# 汉明距离

461. 汉明距离 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)

image-20210325201524171

我太菜了,连基本的位运算都不会太难了

func hammingDistance(x int, y int) int {
   // 进行异或运算,相同为0,不同为1
   diff:=x^y
   ans:=0
   // 当我们的diff为0时我们就计算完了
   for diff > 0 {
      // 当我们这位不相同时,我们异或运算的结果就为1
      ans+=diff&1
      // 然后我们往右移动一位
      diff>>=1
   }
   return ans
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 颠倒二进制位

190. 颠倒二进制位 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)

# 只出现一次的数字

136. 只出现一次的数字 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)

# 二进制特性

利用二进制的一些特性,我们可以把位运算使用到更多问题上。 例如,我们可以利用二进制和位运算输出一个数组的所有子集。假设我们有一个长度为 n 的 数组,我们可以生成长度为 n 的所有二进制,1 表示选取该数字,0 表示不选取。这样我们就获 得了 2 n 个子集

# 4的幂

342. 4的幂 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)

image-20210325202700345

。。。这题目就一行代码,感觉我好菜啊

func isPowerOfFour(n int) bool {
   return n>0 && (n & (n-1))==0 && (n&1431655765)>0
}
1
2
3

# 最大单词长度乘积

318. 最大单词长度乘积 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)

# 比特位计数

338. 比特位计数 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)

编辑 (opens new window)
上次更新: 2021/03/25, 23:10:37
数学问题
数据结构

← 数学问题 数据结构→

Theme by Vdoing | Copyright © 2021-2021 小游
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式