小编典典

紧凑地写入10的幂作为常数

go

我正在阅读最近发布的The Go Programming
Language
,到目前为止,这是一件令人高兴的事情(Brian
Kernighan是其中的一位作者,无论如何我都不会期待别的什么)。

我在第3章遇到了以下练习:

练习3.13const尽可能紧凑地通过YB 编写KB,MB的声明。

:在此上下文中,KB,MB等表示1000的幂)

在此之前有一节,其中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 的幂。

有任何想法吗?


阅读 377

收藏
2020-07-02

共1个答案

小编典典

我会说,这是不可能的,因为你想要的是代表一个功能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

但可悲的是,足够的按位移位是整数运算。

2020-07-02