我们遇到数值进行除2的通常写法为 xxx / 2 这样的,今天看了一下golang sort.search方法实现 发现了一个新的思路
func Search(n int, f func(int) bool) int {
// Define f(-1) == false and f(n) == true.
// Invariant: f(i-1) == false, f(j) == true.
i, j := 0, n
for i < j {
h := int(uint(i+j) >> 1) // avoid overflow when computing h
// i ≤ h < j
if !f(h) {
i = h + 1 // preserves f(i-1) == false
} else {
j = h // preserves f(j) == true
}
}
// i == j, f(i-1) == false, and f(j) (= f(i)) == true => answer is i.
return i
}
这一段 很奇怪为啥要这么写
int(uint(i+j) >> 1)
个人理解 首先将i、j的和转成uint 这个应该是害怕int值不够导致的溢出
随后将和的值 右位移1位 这个操作就相当于 xxx / 2了
写了一个压测的代码 看了一下最终的效果 比 xxx / 2的运行效率更高一些
如此反推 如果我们进行 * 2 操作 我们可以左位移1位即可
package main
import "testing"
func BenchmarkA(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = 64 >> 1
}
}
func BenchmarkB(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = 64 / 2
}
}