学习位运算

前言

最近在学习 golang 的时候发现一个代码,发现看不懂

const (
    read byte = 1 << iota
    wirte
    exec
)
func main() {
    b := read | exec
    fmt.Println(b)
    // Output: 5
}
  • 看不懂是因为 不知道 | 是什么意思
  • 另一方面则是计算机基础不牢固

位运算

  1. 什么是位运算?
    位操作是一种通过算法来处理bit或比单词短的数据片段的操作

  2. 位运算有什么好处?
    位操作可以避免或者减少在一个数据结构上需要进行循环的次数,并且可以成倍的效率提升,因为位操作是并行处理的

  3. 为运算有什么缺点?
    位操作的代码比较难编写并且理解

  4. 位运算最常见的例子
    在linux中赋予文件读写权限
    chmod 777 file_name

1. 了解位运算符

参考地址

A = 0011 1100
B = 0000 1101
---------------

A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001

在哪里可以用到

  • 比如说一篇文章有三种种不同的状态:置顶,不置顶,推荐,不推荐,已看,未看

  • 如果我们要对这种状态进行确认,我们就需要在一个表中创建三个状态属性:1.是否置顶(if_top) , 2.是否推荐(if_recommend),3.是否已看(has_read)

  • 但如果我们用位运算则只需要一在表中创建一个属性 position

const (
    top int = 1 << iota // 置顶状态 
    //(推荐 枚举iota 大多从1开始,因为 golang 中 int 的默认值为0,可能会有意想不到的理解错误)
    recommend // 推荐
    read    // 已读
)

func main() {
    article := GetArticle()
    // 判断文章是否是置顶
    if (article & top) == top {
        fmt.Println(该文章置顶)
    }

    if (article & recommend) == recommend {
        fmt.Println(该文章推荐)
    }

    if (article & read) == read {
        fmt.Println(该文章已读)
    }
    // output: 该文章置顶并且已读

    // 删除文章置顶状态
    articleWithoutTop := DeleteTop(article)
    fmt.Println(articleWithoutTop)
}

// 获取文章状态
func GetArticle() int {
// 该文章同时拥有 置顶和 已读状态 ( Output: 5 )
    state := top | read
    return state 
}

// 取消文章置顶状态
func DeleteTop(article int) int {
    if (article & top) == top {
        return article^top
    }
    return article 
}
  • 这意味着我们可以很方便的对不同的状态进行修改,并且对数据库的操作只有一个参数进行的修改

补充

www.zhihu.com/question/38206659

结语

  • 感谢阅读
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!