2 回答
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
}
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
- 2 回答
- 0 關注
- 88 瀏覽
添加回答
舉報
