在Ruby中,铲运算符(<<)如何在两个整数上工作?

时间:2017-03-15 04:22:15

标签: ruby integer operator-keyword

我是初学者/中级Ruby学习者,我跑了一些我不理解的东西。我环顾了一下 stackoverflow ,但找不到一个清晰,简洁的答案,这就是为什么我要创建一个新问题。

如果给出数字a和b,当r等于:

时,结果是什么r
a << b 

特别是,我正在寻找一个表示三个变量之间关系的通用方程。此外,深入了解Ruby如何在引擎盖下工作受到欢迎,但是次要的。

仅供参考,如果有帮助,我在“https://repl.it/languages/ruby”使用repl.it。

提前致谢!

编辑:&lt;&lt;通常称为二进制或按位左移运算符。 根据Andrey Deineko的EDIT2:这个问题与顶部列出的其他帖子不同,因为在另一篇文章中,没有明确,简明的答案如何运作。它简单地说它是一个按位左移位运算符,并显示了一些使用该方法的输出示例。特别是,我一直在寻找它如何在整数或fixnums上工作。似乎另一篇文章是关于运营商的一般用途。重申一下,这个问题是不同的,因为它特别适用于它如何在整数上工作,因此,下面的答案更详细地说明它如何在二进制级别上工作。

2 个答案:

答案 0 :(得分:5)

该操作被称为“按位左移”,并且很容易被该术语转换。

简而言之,它采用LHO的二进制表示,并将其向左移动count,指定为RHO。

考虑一下5 << 25由(64位)表示:

0000 0000 0000 0101

2左移是:

00 0000 0000 0101 00 # = 0000 0000 0001 0100

或反过来,20。我们来看看:

5 << 2
#⇒ 20

由于二进制数字基本系统的性质,左移相当于乘以2的相应幂。那就是说,

m << n ≡ m × 2ⁿ

5 << 4 #⇒ 5 × 2⁴ ≡ 80
#⇒ 80

答案 1 :(得分:1)

根据您的Ruby版本,整数可以从Fixnum继承instrumentalisations,或Integer

无论哪种方式,操作都是相同的:分配给<<a的整数将b解释为按位左移运算符。你可以在这里看到幕后发生的事情:https://ruby-doc.org/core-2.4.0/Integer.html#method-i-3C-3C

这里有一个关于此运算符的有趣讨论:Clarification on the Ruby << Operator