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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一名路过的小码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值