亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用按位運算符將任何負值轉換為零?

如何使用按位運算符將任何負值轉換為零?

Go
婷婷同學_ 2022-09-05 10:54:22
我正在為Go中的LinkedList編寫操作,代碼如下所示:PopBack()// PopBack will remove an item from the end of the linked listfunc (ll *LinkedList) PopBack() {    lastNode := &ll.node    for *lastNode != nil && (*lastNode).next != nil {        lastNode = &(*lastNode).next    }    *lastNode = nil    if ll.Size() != 0 {        ll.size -= 1    }}我不喜歡最后一句話;如果大小為零,我們不想遞減為負值。我想知道是否有一個按位運算,其中無論遞減后的值是什么,如果它只是負數,它應該隱蔽到零?if
查看完整描述

2 回答

?
GCT1015

TA貢獻1827條經驗 獲得超4個贊

在循環的每次迭代中交換一個 nil 檢查,換取循環之前的單個 nil 檢查。通過此更改,循環運行得更快,并且用于更新大小的運算符是減法。


func (ll *LinkedList) PopBack() {

    if ll.node == nil {

        return

    }

    lastNode := &ll.node

    for (*lastNode).next != nil {

        lastNode = &(*lastNode).next

    }

    *lastNode = nil

    ll.size -= 1

}


查看完整回答
反對 回復 2022-09-05
?
慕婉清6462132

TA貢獻1804條經驗 獲得超2個贊

負值設置了符號位,因此您可以這樣做


ll.size += (-ll.size >> 31)

假設為 int32 并返回 。當然,這也意味著大小永遠不會是負數。當大小為正時,右移將符號擴展以使其為-1,否則它將為0ll.sizell.Size()ll.size-ll.size


如果 是 int64,則將移位計數更改為 63。如果 是 uint64,如果大小從不大于 2 63,則可以簡單地轉換為 int64。但是,如果尺寸可以那么大(盡管在遙遠的將來幾乎不可能發生),那么事情就要棘手得多:ll.sizell.size


mask := uint64(-int64(ll.size >> 63)) // all ones if ll.size >= (1 << 63)

ll.size = ((ll.size - 1) & mask) | ((ll.size + uint64(-int64(ll.size) >> 63)) & ^mask)

它基本上是一個通常用于bithacks的按位mux,因為你不能在沒有golang的情況下將bool轉換為int。if


乍一看,這些都不是可讀的,所以塊通常更好if


查看完整回答
反對 回復 2022-09-05
  • 2 回答
  • 0 關注
  • 88 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號