我正在阅读最近发布的The Go Programming Language,到目前为止,这是一件令人高兴的事情(Brian Kernighan是其中的一位作者,无论如何我都不会期待别的什么)。
我在第3章遇到了以下练习:
练习3.13const尽可能紧凑地通过YB 编写KB,MB的声明。
const
( 注 :在此上下文中,KB,MB等表示1000的幂)
在此之前有一节,其中iota介绍了一种有用的常量生成器机制。特别是,上一段展示了一种很好而紧凑的方式来将1024的幂定义为常量:
iota
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 的幂。
有任何想法吗?
我会说,这是不可能的,因为你想要的是代表一个功能10^(3i),其中i是一个正整数,如一些功能f(i),其中f是你小学去功能的集成功能(+, - ,/,*)。
10^(3i)
i
f(i)
f
可能2^(10i)仅是因为go引入了另一个基本函数整数幂。因此,如果1 << y允许y浮动,则可以修改代码以使用1 << (log2(10) * 3 * i)。之所以可行,是因为这等同于解决10^(3i) = 2^y。取双方的log2 y = log2(10) * 3 * i。
2^(10i)
1 << y
1 << (log2(10) * 3 * i)
10^(3i) = 2^y
y = log2(10) * 3 * i
但可悲的是,足够的按位移位是整数运算。