Golang位运算技巧大全

在Golang开发中,位运算有哪些实用的技巧可以提升代码性能?比如如何高效地进行标志位操作、快速乘除法或者优化内存使用?希望能分享一些实际应用场景和代码示例,特别是那些容易被忽略但很有用的技巧。

2 回复

Golang位运算常用技巧:

  1. 判断奇偶:n & 1 == 1
  2. 乘/除2:n << 1 / n >> 1
  3. 交换两数:a ^= b; b ^= a; a ^= b
  4. 取反加1(补码):^n + 1
  5. 判断2的幂:n & (n-1) == 0
  6. 取最低位1:n & -n
  7. 移除最低位1:n & (n-1) 位运算高效简洁,适合底层优化。

更多关于Golang位运算技巧大全的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang 位运算技巧大全

基础位运算符

&    // 按位与
|    // 按位或
^    // 按位异或
&^   // 按位清除(AND NOT)
<<   // 左移
>>   // 右移

实用技巧

1. 判断奇偶性

func isEven(n int) bool {
    return n&1 == 0
}

func isOdd(n int) bool {
    return n&1 == 1
}

2. 交换两个数(不使用临时变量)

a, b = a^b, a^b
a = a ^ b

3. 判断是否为2的幂

func isPowerOfTwo(n int) bool {
    return n > 0 && (n&(n-1)) == 0
}

4. 计算绝对值

func abs(n int) int {
    mask := n >> 31
    return (n + mask) ^ mask
}

5. 取模运算(对2的幂)

// n % 8
result := n & 7

6. 乘以/除以2的幂

// 乘以8
result := n << 3
// 除以8
result := n >> 3

7. 设置特定位

// 设置第3位(从0开始)
n |= 1 << 3
// 清除第3位
n &^= 1 << 3
// 切换第3位
n ^= 1 << 3

8. 检查特定位

// 检查第3位是否设置
if n&(1<<3) != 0 {
    // 位已设置
}

9. 统计1的个数

func countBits(n int) int {
    count := 0
    for n != 0 {
        n &= n - 1
        count++
    }
    return count
}

10. 反转位

func reverseBits(n uint32) uint32 {
    var result uint32
    for i := 0; i < 32; i++ {
        result = (result << 1) | (n & 1)
        n >>= 1
    }
    return result
}

11. 找出单独出现的数字

// 数组中只有一个数字出现一次,其他都出现两次
func singleNumber(nums []int) int {
    result := 0
    for _, num := range nums {
        result ^= num
    }
    return result
}

12. 掩码操作

const (
    ReadPermission = 1 << iota
    WritePermission
    ExecutePermission
)

// 添加权限
permissions |= ReadPermission | WritePermission

// 检查权限
if permissions&ReadPermission != 0 {
    // 有读权限
}

// 移除权限
permissions &^= WritePermission

这些技巧在算法优化、权限管理、数据压缩等场景中非常有用。位运算通常比算术运算更快,能够有效提升程序性能。

回到顶部