第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

一些運(yùn)算符“|”、“^”、“&”、“&^”之間的區(qū)別。高朗

一些運(yùn)算符“|”、“^”、“&”、“&^”之間的區(qū)別。高朗

Go
翻閱古今 2021-09-13 16:13:28
最近讀了 golang 規(guī)范,遇到了一些有趣的操作符:&    bitwise AND            integers|    bitwise OR             integers^    bitwise XOR            integers&^   bit clear (AND NOT)    integers我試過玩它,但我唯一理解的是“|” 添加整數(shù)和“+”運(yùn)算符還可以處理浮點(diǎn)數(shù)、字符串等。它們在實(shí)踐中有何用途?任何人都可以對上面的這 4 個(gè)運(yùn)算符做一些解釋嗎?
查看完整描述

2 回答

?
largeQ

TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊

當(dāng)您必須處理字節(jié)級或位級數(shù)據(jù)時(shí),按位運(yùn)算符就派上用場了。


在這里,我列出了一些使用位操作和代碼示例的示例(無特定順序):


1.它們很常見,并且是密碼學(xué)和散列函數(shù)(例如MD5)中許多算法的一部分。


2.如果您想“節(jié)省”空間并將多個(gè)“bool”變量打包成一個(gè)int,它們也經(jīng)常使用,例如,您為每個(gè) bool 變量分配一個(gè)位。您必須使用按位運(yùn)算符才能單獨(dú)更改/讀取位。


例如,將 8 位/布爾值打包為一個(gè)int:


flags := 0x00  // All flags are 0

flags |= 0x02  // Turn the 2nd bit to 1 (leaving rest unchanged)

flags |= 0xff  // Turn 8 bits (0..7) to 1

flags &= 0xfe  // Set the lowest bit to 0 (leaving rest unchanged)


istrue := flags&0x04 != 0 // Test if 3rd bit is 1

3.另一個(gè)領(lǐng)域是壓縮數(shù)據(jù),您希望充分利用 abyte并使用其所有位來存儲(chǔ)/檢索某些信息(位是計(jì)算和數(shù)字通信中的基本信息單位)。


4.類似于壓縮但又不完全相同:比特流。它還用于通過不發(fā)送完整字節(jié)而是發(fā)送具有任意位長度的字段來節(jié)省數(shù)據(jù)流中的空間。


我編寫并發(fā)布了一個(gè)高度優(yōu)化的位級 Reader 和 Writer 包,在此處開源:github.com/icza/bitio。您將在其源代碼中看到各種位操作的廣泛使用。


5.另一個(gè)實(shí)際用途:測試(整數(shù))數(shù)的某些屬性。知道整數(shù)的二進(jìn)制表示(二進(jìn)制補(bǔ)碼),在它們的二進(jìn)制表示中有數(shù)字的某些特征。例如,如果最低位為 0,則整數(shù)(以 2 的補(bǔ)碼形式)是偶數(shù)(可以被 2 整除):


func isEven(i int) bool {

    return i&0x01 == 0

}

通過測試整數(shù)的位,您還可以判斷它是否是 2 的冪。例如,如果一個(gè)正數(shù)只包含一位1,那么它就是 2 的冪(例如2 = 0x02 = 00000010b,16 = 0x10 = 00010000但17 = 0x11 = 00010001不是 2 的冪)。


6. 許多編碼/解碼過程也使用位操作。最簡單的是UTF-8 編碼,它使用可變長度編碼將 unicode 代碼點(diǎn)(rune在 Go 中)表示為字節(jié)序列。

可變長度編碼的一個(gè)簡單變體可能是使用字節(jié)的最高位(如果 0 索引是第 8 位或第 7 位)來表示是否需要更多字節(jié)來解碼一個(gè)數(shù)字,而其余 7 位始終是“有用的” “ 數(shù)據(jù)。您可以測試最高位并“分離” 7 個(gè)有用的位,如下所示:


b := readOneByte()

usefulBits := b & 0x7f

hasMoreBytes := b & 0x80 != 0

使用這種變長編碼的好處是,即使你uint64在 Go 中使用內(nèi)存中 8 個(gè)字節(jié)的類型,小數(shù)字仍然可以用更少的字節(jié)表示(范圍內(nèi)的數(shù)字0..127只需要 1 個(gè)字節(jié)?。?。如果要存儲(chǔ)或傳輸?shù)臉颖居泻芏嘈≈?,僅此一項(xiàng)就可以將數(shù)據(jù)壓縮到 1/8 = 12.5 %。不利的一面是大數(shù)字(即使在最高字節(jié)中也有位)將使用超過 8 個(gè)字節(jié)。是否值得取決于樣本的啟發(fā)式。


X. 名單還在繼續(xù)……


在 Go(以及許多其他編程語言)中,你能不知道/使用按位運(yùn)算符嗎?答案是肯定的。但如果您了解他們,有時(shí)他們可以讓您的生活更輕松,您的程序更有效率。


如果您想了解有關(guān)該主題的更多信息,請閱讀維基百科文章:Bitwise operation并谷歌術(shù)語“Bitwise Operators Tutorial”,有很多好文章。


查看完整回答
反對 回復(fù) 2021-09-13
?
長風(fēng)秋雁

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊

對于他們在技術(shù)上所做的事情,請查看這里的評論


package main


import "fmt"


func main() {

    // Use bitwise OR | to get the bits that are in 1 OR 2

    // 1     = 00000001

    // 2     = 00000010

    // 1 | 2 = 00000011 = 3

    fmt.Println(1 | 2)


    // Use bitwise OR | to get the bits that are in 1 OR 5

    // 1     = 00000001

    // 5     = 00000101

    // 1 | 5 = 00000101 = 5

    fmt.Println(1 | 5)


    // Use bitwise XOR ^ to get the bits that are in 3 OR 6 BUT NOT BOTH

    // 3     = 00000011

    // 6     = 00000110

    // 3 ^ 6 = 00000101 = 5

    fmt.Println(3 ^ 6)


    // Use bitwise AND & to get the bits that are in 3 AND 6

    // 3     = 00000011

    // 6     = 00000110

    // 3 & 6 = 00000010 = 2

    fmt.Println(3 & 6)  


    // Use bit clear AND NOT &^ to get the bits that are in 3 AND NOT 6 (order matters)

    // 3      = 00000011

    // 6      = 00000110

    // 3 &^ 6 = 00000001 = 1

    fmt.Println(3 &^ 6)

}

View it on the playground


請注意,我舉了兩個(gè)例子|來表明它并不是真正的加法,如1 + 5.


至于實(shí)際用途,我相信其他一些人可以用更多的例子來評論,但一個(gè)常見的用途是為許可系統(tǒng)之類的東西創(chuàng)建標(biāo)志位掩碼。


查看完整回答
反對 回復(fù) 2021-09-13
  • 2 回答
  • 0 關(guān)注
  • 169 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號