将10的幂写为紧凑的常数

时间:2015-12-06 23:47:02

标签: go const iota

我正在阅读最近发布的The Go Programming Language,到目前为止一直是一种喜悦(Brian Kernighan是作者之一,无论如何我都不会期待任何其他事情。)

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

  

练习3.13   尽可能紧凑地写出KB,MB,最高YB的const声明。

注意:在此上下文中,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的幂。

有什么想法吗?

2 个答案:

答案 0 :(得分:7)

你自己引用了它:

  

iota机制有其局限性。例如,由于没有取幂运算符,因此无法生成更熟悉的1000(KB,MB及其子)的幂。

尽管他们不知道,但作者并不希望你找到办法。作者希望您为KB,MB等创建常量声明。尽可能紧凑

使用浮点文字

这是一种紧凑的方式。这利用Floating-point literals和指数部分。想一想:写1e3甚至比写1000还要短(更不用说其余的......)。

它还将所有标识符压缩为一个常量规范,因此我们将=符号减少为1。

这里只有一行( 67个字符没有空格):

const ( KB, MB, GB, TB, PB, EB, ZB, YB = 1e3, 1e6, 1e9, 1e12, 1e15, 1e18, 1e21, 1e24 )

请注意,由于我们使用了浮点文字,因此常量标识符(KBMB ...)表示浮点常量,即使文字符号为&#39;小数部分为零。

使用整数文字,使用KB作为乘数

如果我们想要无类型的整数常量,我们必须为1000KB。为了获得下一个,我们将自动转向将前一个标识符与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,你可以多次使用它来代替*KB进行乘法,你甚至可以从上一个解决方案中获得3个字符:

使用额外的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常量指定为符文常量,并且其代码点为1000的符号为'Ϩ',则我们甚至可以再缩短一个字符 - 这是1字符少:))

使用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)

请注意,这些将是符文常量,但与所有其他数字常量一样,它们表示任意精度的值,并且不会溢出。

答案 1 :(得分:3)

我想说这是不可能的,因为你想要的是代表一个函数10^(3i),其中i是一个正整数,因为某个函数f(i),其中f是你的基本go函数的集成函数(+, - ,/,*)。

2^(10i)可能只是因为引入了另一个基本函数整数取幂。因此,如果1 << y允许y浮动,您就可以修改代码以使用1 << (log2(10) * 3 * i)。这会奏效,因为这相当于解决10^(3i) = 2^y。取双方的log2 y = log2(10) * 3 * i

但遗憾的是,按位移位是整数运算。