我正在阅读最近发布的Go程序设计语言,到目前为止,它是joy的作品(布莱恩·克尼汉是作者之一,我除了优秀之外什么都不会期待)。
我遇到了关于第三章的下列练习:
练习3.13为KB,MB编写
const声明,尽可能简洁地通过YB。
(注意事项:在此上下文中,KB、MB等表示1,000的幂)
在前面的一节中,引入了iota作为一种有用的常量生成机制;特别是,上一段展示了将1024的幂定义为常量的一种很好且紧凑的方法:
const (
_ = 1 << (10 * iota)
KiB
MiB
GiB
TiB
PiB
EiB
ZiB
YiB
)提交人还提到了关于10项权力的规定:
iota机制有其局限性。例如,不可能生成更熟悉的1000的幂(KB、MB等),因为没有指数运算符。
我在这个练习中挣扎,因为它看起来比简单地手工拼写1000的能力要复杂一些(特别是因为它是在iota引入之后出现的)。我觉得有一些聪明的方法可以将iota与其他东西巧妙地结合在一起。
我想找一种系统的方法,从1024的每一次幂中减去“多余”的数量,得到1000的幂,但它却使我无处可寻。然后,我查看了二进制表示,试图推断出iota可能有用的一般模式,但我还是一无所获。
我真的看不出没有指数运算符就能从一个增量值(iota)中产生1000的幂。
有什么想法吗?
发布于 2015-12-07 00:39:40
我认为这是不可能的,因为您想要表示一个函数10^(3i),其中i是一个正整数,它是一个函数f(i),其中f是基本go函数(+,-,/,*)的一个综合函数。
这对于2^(10i)来说是可能的,因为go引入了另一个初等函数整数指数。因此,如果1 << y允许y浮动,则可以修改代码以使用1 << (log2(10) * 3 * i)。这样做是可行的,因为这相当于解决10^(3i) = 2^y。采取log2的双方y = log2(10) * 3 * i。
但可悲的是,足够多的按位移位是整数运算。
发布于 2015-12-08 00:00:43
你自己引用了它:
iota机制有其局限性。例如,不可能生成更熟悉的1000的幂(KB、MB等),因为没有指数运算符。
作者不希望你仍然找到一个方法,尽管他们不知道任何。作者希望您尽可能地为KB、MB等创建常量声明。
带浮点字面值
这是一种紧凑的方法。这利用了带指数部分的浮点文字。想想看:编写1e3甚至比编写1000还要短(更不用说其余的.)。
此外,它还将所有标识符压缩为一个常量规范,因此我们将=符号压缩为1。
下面是一行(67个字符,没有空格):
const ( KB, MB, GB, TB, PB, EB, ZB, YB = 1e3, 1e6, 1e9, 1e12, 1e15, 1e18, 1e21, 1e24 )注意,由于我们使用了浮点文字,所以常量标识符(KB,MB.)表示浮点常量,即使文字的小数部分为零。
使用整数文本,使用KB作为乘法器
如果我们想要非类型化的整数常量,我们必须为1000编写KB。要获得下一个标识符,我们将自动将前一个标识符乘以1000。但是请注意,我们也可以用KB来乘下一个,因为它确实是1000,但是更短的是两个字符:)。
下面是非类型化的整数常量声明(77个字符,没有空格):
const (KB,MB,GB,TB,PB,EB,ZB,YB = 1000,KB*KB,MB*KB,GB*KB,TB*GB,PB*KB,EB*KB,ZB*KB)(很抱歉删除了空格,但希望将其放在一行中。)
使用整数文本,使用额外的x const作为乘数。
如果您还引入了1-char长度的const x,您甚至可以从最后一个解决方案中获得3个字符,您可以多次使用它来进行乘法,而不是使用*KB。
有一个额外的x const (74个字符没有空格):
const (x,KB,MB,GB,TB,PB,EB,ZB,YB = 1000,x,x*x,MB*x,GB*x,TB*GB,PB*x,EB*x,ZB*x)与rune文字
如果我们将1000常量指定为rune常量,甚至还可以将其缩短一个字符,其中一个rune的代码点是1000,它是'Ϩ' --减少了一个字符:)
使用rune文字'Ϩ' const (没有空格的73字符):
const (x,KB,MB,GB,TB,PB,EB,ZB,YB = 'Ϩ',x,x*x,MB*x,GB*x,TB*GB,PB*x,EB*x,ZB*x)请注意,这些将是rune常量,但与所有其他数值常量一样,它们表示任意精度的值,并且不会溢出。
https://stackoverflow.com/questions/34124294
复制相似问题