码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 位运算常用技巧以及练习


    几个有趣的操作

    • 利用或操作|和空格将英文字符转换成小写

      	// 可以变成小写
      	i := 'a' | ' '
      	fmt.Printf("%c\n", i)
      	j := 'A' | ' '
      	fmt.Printf("%c\n", j)
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 利用与操作&和下划线把英文字符转换成大写

      	// 可以变成大写
      	m := 'b' & '_'
      	n := 'B' & '_'
      	fmt.Printf("%c\n", m)
      	fmt.Printf("%c\n", n)
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 大小写转换

      	// 可以大小写转换
      	a := 'd' ^ ' '
      	b := 'D' ^ ' '
      	fmt.Printf("%c\n", a)
      	fmt.Printf("%c\n", b)
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 判断两个数是否异号

      	x := -1
      	y := 2
      	f := (x ^ y) < 0
      	fmt.Println(f) // true
      
      	m := 3
      	n := 2
      	z := (m ^ n) < 0
      	fmt.Println(z) // false
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
    • 临时交换两个数字

      	a := 1
      	b := 2
      	a ^= b
      	b ^= a
      	a ^= b
      	fmt.Println(a)
      	fmt.Println(b)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    • 加1

      	n := 0
      	n = -^n
      	fmt.Println(n) // 1
      
      • 1
      • 2
      • 3
    • 减1

      	n := 0
      	n = ^-n
      	fmt.Println(n) // -1
      
      • 1
      • 2
      • 3

    n & (n - 1)的运用

    作用:消除数字n的二进制表示中的最后一个1

    在这里插入图片描述
    本图借用了labuladong算法,特此声明

    其核心逻辑就是,n - 1 一定可以消除最后一个 1,同时把其后的 0 都变成 1,这样再和 n 做一次 & 运算,就可以仅仅把最后一个 1 变成 0 了。

    练习

    191. 位1的个数

    func hammingWeight(num uint32) int {
        count := 0
        for num != 0{
            num = num & (num - 1)
            count++
        }
        return count
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    231. 2 的幂

    func isPowerOfTwo(n int) bool {
        if n <= 0 {
            return false
        }
        // 如果一个数是2的幂次方,那么它的二进制中一定只有一个1
        return n & (n - 1) == 0
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    a ^ a = 0的运用

    一个数和它本身的异或运算结果为0,即a ^ a = 0;一个数和0做异或运算的结果为它本身,即a ^ 0 = a

    练习

    136. 只出现一次的数字

    func singleNumber(nums []int) int {
        N := len(nums)
        res := nums[0]
        for i := 1; i < N; i++ {
            res = res ^ nums[i]
        }
        return res
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    268. 丢失的数字

    • 思路1:排序

    • 思路2:HashSet

    • 思路3:等差数列

      func missingNumber(nums []int) int {
          N := len(nums)
          sum := (0 + N) * (N + 1) / 2
          res := 0
          for i := 0; i < N; i++ {
              res += nums[i]
          }
          return sum - res
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
    • 思路4:异或运算

      找缺失数、找出现一次数都是异或的经典应用。

      我们可以先求得 (1,n)的异或和 ,然后用这个结果对各个数字进行异或。

      这样最终得到的异或和表达式中,只有缺失元素出现次数为一次,其余元素均出现两次,即最终答案为缺失元素。

      func missingNumber(nums []int) int {
          N := len(nums)
          ans := 0
          for i := 0; i <= N; i++ {
              ans ^= i
          }
          for i := 0; i < N; i++ {
              ans ^= nums[i]
          }
          return ans
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
  • 相关阅读:
    GSAman | 我「玩着游戏」就把「科研做了」
    Kotlin 乘法、我怎么越乘越小?
    【LlamaIndex 教程】一文看懂LlamaIndex用法,为LLMs学习私有知识
    recastnavigation.Sample_TempObstacles代码注解 - rcBuildHeightfieldLayers
    周报、月报有多折磨人?万能报表模板建议收藏!(附模板)
    大模型备案关注点最详细说明【附流程+附件】
    Spring Boot 3的AOT(GraalVM Native Image)应用开发
    Linux之gdb安装和升级
    k8s强制删除一个 Pod
    第十七届智能车竞赛 - 磁力计角度数据处理
  • 原文地址:https://blog.csdn.net/qq_61039408/article/details/127820604
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号