问题:
使用Go实现bitcount函数,统计一个uint64型数值中被设置为 1 的比特位的数量。
方案一:
最容易想到的实现就是每次右移一位,检测最后一位是否是1,这样完成挨个比特检测后,就可以得出结果。
func bitCount1(n uint64)int8{
var count int8
var i uint
for i < 64 {
if ( (n >> i) & 1) != 0{
count += 1
}
i += 1
}
return count
}
var BitCount = bitCount1
实现一个测试函数和一个基准测试函数测试正确性和性能:
测试环境:
型号名称: MacBook Pro
处理器名称: Intel Core i7
处理器速度: 2.5 GHz
处理器数目: 1
核总数: 4
L2 缓存(每个核): 256 KB
L3 缓存: 6 MB
超线程技术: 已启用
内存: 16 GB
// main_test.go
package main
import "testing"
var tests = []struct{
input uint64
want int8
}{
{ 7118255637391829670 , 34 },
{ 7064722311543391783 , 25 },
{ 4608963400064623015 , 34 },
{ 14640564048961355682 , 39 },
{ 8527726038136987990 , 27 },
{ 9253052485357177493 , 29 },
{ 8999835155724014433 , 28 },
{ 14841333124033177794 , 35 },
{ 1220369398144154468 , 33 },
{ 15451339541988045209 , 33 },
{ 2516280747705128559 , 28 },
{ 4938673901915240208 , 29 },
{ 410238832127885933 , 29 },
{ 1332323607442058439 , 33 },
{ 15877566392368361617 , 30 },
{ 3880651382986322995 , 35 },
{ 3639402890245875445 , 30 },
{ 16428413304724738456 , 39 },
{ 14754380477986223775 , 37 },
{ 2517156707207435586 , 29 },
{ 15317696849870933326 , 30 },
{ 6013290537376992905 , 35 },
{ 17378274584566732685 , 29 },
{ 5420397259425817882 , 31 },
{ 11286722219793612146 , 35 },
{ 8183954261149622513 , 30 },
{ 17190026713975474863 , 41 },
{ 379948598362354167 , 34 },
{ 3606292518508638567 , 31 },
{ 10997458781072603457 , 33 },
{ 7601699521132896572 , 31 },
{ 16795555978365209258 , 34 },
{ 9555709025715093094 , 35 },
{ 2957346674371128176 , 29 },
{ 6297615394333342337 , 36 },
{ 15800332447329707343 , 31 },
{ 10989482291558635871 , 36 },
{ 10116688196032604814 , 29 },
{ 13017684861263524258 , 29 },
{ 9721224553709591475 , 35 },
{ 7710983100732971068 , 28 },
{ 11089894095639460077 , 38 },
{ 938751439326355368 , 34 },
{ 8732591979705398236 , 33 },
{ 5679915963518233779 , 36 },
{ 1653290938