golang 乘或除二 高效做法

我们遇到数值进行除2的通常写法为 xxx / 2 这样的,今天看了一下golang sort.search方法实现 发现了一个新的思路 

上代码 对应代码目录 $GOROOT/src/sort/search.go

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
	}
}

golang 乘或除二 高效做法

 

上一篇:Hadoop 生态里,为什么 Hive 活下来了?


下一篇:hive原理与实操(一):hive基本概念与安装