学习位运算
前言
最近在学习 golang 的时候发现一个代码,发现看不懂
const ( read byte = 1 << iota wirte exec ) func main() { b := read | exec fmt.Println(b) // Output: 5 }
- 看不懂是因为 不知道
|
是什么意思 - 另一方面则是计算机基础不牢固
位运算
什么是位运算?
位操作是一种通过算法来处理bit或比单词短的数据片段的操作位运算有什么好处?
位操作可以避免或者减少在一个数据结构上需要进行循环的次数,并且可以成倍的效率提升,因为位操作是并行处理的为运算有什么缺点?
位操作的代码比较难编写并且理解位运算最常见的例子
在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 协议》,转载必须注明作者和本文链接