当前位置: 首页 > news >正文

GO语言圣经 第二章习题

练习2.1

向tempconv包添加类型、常量和函数用来处理Kelvin绝对温度的转换,Kelvin 绝对零度是−273.15°C,Kelvin绝对温度1K和摄氏度1°C的单位间隔是一样的。

conv.go

package tempconv// CToF converts a Celsius temperature to Fahrenheit.
func CToF(c Celsius) Fahrenheit { return Fahrenheit(c*9/5 + 32) }// FToC converts a Fahrenheit temperature to Celsius.
func FToC(f Fahrenheit) Celsius { return Celsius((f - 32) * 5 / 9) }func KToC(k Kelvin) Celsius { return Celsius(k + 273.15) }func CToT(c Celsius) Kelvin { return Kelvin(c + 273.15) }

tempconv.go

package tempconvimport "fmt"type Celsius float64
type Fahrenheit float64
type Kelvin float64const (AbsoluteZeroC Celsius = -273.15FreezingC     Celsius = 0BoilingC      Celsius = 100
)func (c Celsius) String() string    { return fmt.Sprintf("%g°C", c) }
func (f Fahrenheit) String() string { return fmt.Sprintf("%g°F", f) }
func (k Kelvin) String() string     { return fmt.Sprintf("%g°K", k) }

练习2.2

写一个通用的单位转换程序,用类似cf程序的方式从命令行读取参数,如果缺省的话则是从标准输入读取参数,然后做类似Celsius和Fahrenheit的单位转换,长度单位可以对应英尺和米,重量单位可以对应磅和公斤等。

conv.go:

package lenthconvfunc MToF(m Meter) Feet { return Feet(m / 0.3084) }func FToM(f Feet) Meter { return Meter(f * 0.3084) }

lenthconv:

package lenthconvimport "fmt"type Meter float64
type Feet float64func (m Meter) String() string { return fmt.Sprintf("%g m", m) }
func (f Feet) String() string  { return fmt.Sprintf("%g ft", f) }

test:

package mainimport ("bufio""fmt""os""strconv""gopl.io/ch2/lenthconv"
)func main() {if len(os.Args) == 1 {input := bufio.NewScanner(os.Stdin)for input.Scan() {t, err := strconv.ParseFloat(input.Text(), 64)if err != nil {fmt.Fprintf(os.Stderr, "cf: %v\n", err)os.Exit(1)}f := lenthconv.Feet(t)m := lenthconv.Meter(t)fmt.Printf("%s = %s, %s = %s\n",f, lenthconv.FToM(f), m, lenthconv.MToF(m))}}for _, arg := range os.Args[1:] {t, err := strconv.ParseFloat(arg, 64)if err != nil {fmt.Fprintf(os.Stderr, "cf: %v\n", err)os.Exit(1)}f := lenthconv.Feet(t)m := lenthconv.Meter(t)fmt.Printf("%s = %s, %s = %s\n",f, lenthconv.FToM(f), m, lenthconv.MToF(m))}
}

练习2.3

重写PopCount函数,用一个循环代替单一的表达式。比较两个版本的性能。

func PopCount(x uint64) int {res := 0for i := 0; i < 8; i++ {res += int(pc[byte(x>>(i*8))])}return res
}

练习2.4

用移位算法重写PopCount函数,每次测试最右边的1bit,然后统计总数。比较和查表算法的性能差异。

func PopCount(x uint64) int {res := 0for x != 0 {res += x & 1x >>= 1}return res
}

练习2.5

表达式x&(x-1)用于将x的最低的一个非零的bit位清零。使用这个算法重写PopCount函数,然后比较性能。

func PopCount(x uint64) int {res := 0for x != 0 {res++x &= x - 1}return res
}
http://www.lryc.cn/news/141266.html

相关文章:

  • Java 语言实现线性查找算法
  • xcode15 change
  • MySQL集群(mysql-cluster)
  • 基于神经网络的3D地质模型
  • Spring AOP教程_编程入门自学教程_菜鸟教程-免费教程分享
  • 1.linux的常用命令
  • XiaoFeng.Net 网络库使用
  • 【ES6】—数组的扩展
  • Android 实现资源国际化
  • uni、js——点击与禁用(不可点击)、动态样式class
  • 分布式技术
  • Consul的简介与安装
  • 微服务框架 go-zero logx 日志组件剖析
  • 基于Java+SpringBoot+Vue前后端分离图书电子商务网站设计和实现
  • C# Winfrom通过COM接口访问和控制Excel应用程序,将Excel数据导入DataGridView
  • Linux-tomcat环境搭建、jpress部署实践、nginx反向代理
  • SQLmap使用
  • 【Flutter】Flutter 使用 infinite_scroll_pagination 实现无限滚动分页
  • python爬虫的js逆向入门到进阶教程文章分享汇总~持续更新
  • 面试常问:水平居中和垂直居中的方法
  • 第七届“蓝帽杯”初赛取证题目分享
  • go语言学习之有关变量的知识
  • 算法通过村第8关【青铜】| 二叉树的经典算法题
  • Open3D 点云均值滤波
  • C语言指针入门详解
  • 软件工程(十四) 设计模式之结构型模式(二)
  • 不解压的方式直接更新jar包内部的内容
  • 软件工程(八) UML之类图与对象图
  • 【Unity3D赛车游戏】【五】Unity中汽车加速效果是如何优化的?
  • 龙智案例:某大型零售企业如何打造高速、现代化的ITSM体系