学习位运算

295 阅读1分钟

前言

最近在学习 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/38…

结语

  • 感谢阅读