前言
最近在學習 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 協議》,轉載必須註明作者和本文連結