學習位運算

奇蹟師發表於2021-09-09

前言

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

相關文章