首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >10作为常数的写幂紧致

10作为常数的写幂紧致
EN

Stack Overflow用户
提问于 2015-12-06 23:47:01
回答 2查看 3K关注 0票数 7

我正在阅读最近发布的Go程序设计语言,到目前为止,它是joy的作品(布莱恩·克尼汉是作者之一,我除了优秀之外什么都不会期待)。

我遇到了关于第三章的下列练习:

练习3.13为KB,MB编写const声明,尽可能简洁地通过YB。

(注意事项:在此上下文中,KB、MB等表示1,000的幂)

在前面的一节中,引入了iota作为一种有用的常量生成机制;特别是,上一段展示了将1024的幂定义为常量的一种很好且紧凑的方法:

代码语言:javascript
复制
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的幂。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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

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

票数 3
EN

Stack Overflow用户

发布于 2015-12-08 00:00:43

你自己引用了它:

iota机制有其局限性。例如,不可能生成更熟悉的1000的幂(KB、MB等),因为没有指数运算符。

作者不希望你仍然找到一个方法,尽管他们不知道任何。作者希望您尽可能地为KB、MB等创建常量声明。

带浮点字面值

这是一种紧凑的方法。这利用了带指数部分的浮点文字。想想看:编写1e3甚至比编写1000还要短(更不用说其余的.)。

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

下面是一行(67个字符,没有空格):

代码语言:javascript
复制
const ( KB, MB, GB, TB, PB, EB, ZB, YB = 1e3, 1e6, 1e9, 1e12, 1e15, 1e18, 1e21, 1e24 )

注意,由于我们使用了浮点文字,所以常量标识符(KBMB.)表示浮点常量,即使文字的小数部分为零。

使用整数文本,使用KB作为乘法器

如果我们想要非类型化的整数常量,我们必须为1000编写KB。要获得下一个标识符,我们将自动将前一个标识符乘以1000。但是请注意,我们也可以用KB来乘下一个,因为它确实是1000,但是更短的是两个字符:)。

下面是非类型化的整数常量声明(77个字符,没有空格):

代码语言:javascript
复制
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个字符没有空格):

代码语言:javascript
复制
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字符):

代码语言:javascript
复制
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常量,但与所有其他数值常量一样,它们表示任意精度的值,并且不会溢出。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34124294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档