比较Ruby中Fixnums的符号
我只想比较两个固定点的符号。现在我正在使用:比较Ruby中Fixnums的符号,ruby,Ruby,我只想比较两个固定点的符号。现在我正在使用: c = -c if (a >= 0.0 && b < 0.0) || (a < 0.0 && b >= 0.0) 或者,也可以通过其他方式仅比较符号。您可以使用a>=0来实现与“a.sign”类似的目的,使用true表示阳性(非阴性),使用false表示阴性: c = -c if (a>=0) != (b>=0) 如果您经常使用它,并且想要一种更像红宝石的感觉,那么您可能值得使用
c = -c if (a >= 0.0 && b < 0.0) || (a < 0.0 && b >= 0.0)
或者,也可以通过其他方式仅比较符号。您可以使用
a>=0
来实现与“a.sign
”类似的目的,使用true
表示阳性(非阴性),使用false
表示阴性:
c = -c if (a>=0) != (b>=0)
如果您经常使用它,并且想要一种更像红宝石的感觉,那么您可能值得使用上面的注释并将其修补,例如
Numeric#pos?
。您可以将a>=0
用于与“a.sign
”类似的用途,而true
表示正(非负)和false
表示否定:
c = -c if (a>=0) != (b>=0)
如果您经常使用它,并且想要更具Ruby风格的感觉,那么您可能值得使用上面的注释并将其修补,例如
Numeric#pos?
可能。可能只是乘法:
c = -c if a*b < 0
c=-c如果a*b<0
也许只是乘法:
c = -c if a*b < 0
c=-c如果a*b<0
这个问题让我开始在我多年没有打开的汇编工具箱中寻找答案。我想这会满足你的要求:
c = -c if (a < 0) ^ (b < 0)
c=-c如果(a<0)^(b<0)
下面是它正在做的事情:
irb(main):006:0> true ^ true
=> false
irb(main):007:0> true ^ false
=> true
irb(main):008:0> false ^ true
=> true
irb(main):009:0> false ^ false
=> false
irb(主):006:0>true^true
=>错误
irb(主):007:0>正确^false
=>正确
irb(主):008:0>错误^true
=>正确
irb(主):009:0>错误^false
=>错误
根据您的代码,另一种方法是在三元语句中使用它:
((a < 0) ^ (b < 0)) ? -c : c
((a<0)^(b<0))-c:c
以下是一些基准代码和结果:
require 'benchmark'
puts `ruby -v`
N = 10_000_000
A = 1
B = 1
Benchmark.bm(5) do |bench|
bench.report('^') { N.times { (A < 0) ^ (B < 0) } }
bench.report('!=') { N.times { (A>=0) != (B>=0) } }
bench.report('<') { N.times { A*B < 0 } }
end
ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-darwin12.2.0]
user system total real
^ 5.740000 0.000000 5.740000 ( 5.743873)
!= 4.300000 0.000000 4.300000 ( 4.304685)
< 3.310000 0.000000 3.310000 ( 3.312378)
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.0]
user system total real
^ 1.480000 0.000000 1.480000 ( 1.484879)
!= 1.400000 0.000000 1.400000 ( 1.401381)
< 1.260000 0.000000 1.260000 ( 1.256628)
需要“基准测试”
把` ruby-v`
N=10_000_000
A=1
B=1
基准。bm(5)do |台架|
报告('^'){N.times{(A<0)^(B<0)}
bench.report(“!=”){N.times{(A>=0)!=(B>=0)}
bench.report(“这个问题让我开始在我多年没有打开的汇编工具箱中寻找答案。我想这会满足您的需求:
c = -c if (a < 0) ^ (b < 0)
c=-c如果(a<0)^(b<0)
下面是它正在做的事情:
irb(main):006:0> true ^ true
=> false
irb(main):007:0> true ^ false
=> true
irb(main):008:0> false ^ true
=> true
irb(main):009:0> false ^ false
=> false
irb(主):006:0>true^true
=>错误
irb(主):007:0>正确^false
=>正确
irb(主):008:0>错误^true
=>正确
irb(主):009:0>错误^false
=>错误
根据您的代码,另一种方法是在三元语句中使用它:
((a < 0) ^ (b < 0)) ? -c : c
((a<0)^(b<0))?-c:c
以下是一些基准代码和结果:
require 'benchmark'
puts `ruby -v`
N = 10_000_000
A = 1
B = 1
Benchmark.bm(5) do |bench|
bench.report('^') { N.times { (A < 0) ^ (B < 0) } }
bench.report('!=') { N.times { (A>=0) != (B>=0) } }
bench.report('<') { N.times { A*B < 0 } }
end
ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-darwin12.2.0]
user system total real
^ 5.740000 0.000000 5.740000 ( 5.743873)
!= 4.300000 0.000000 4.300000 ( 4.304685)
< 3.310000 0.000000 3.310000 ( 3.312378)
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.0]
user system total real
^ 1.480000 0.000000 1.480000 ( 1.484879)
!= 1.400000 0.000000 1.400000 ( 1.401381)
< 1.260000 0.000000 1.260000 ( 1.256628)
需要“基准测试”
把` ruby-v`
N=10_000_000
A=1
B=1
基准。bm(5)do |台架|
报告('^'){N.times{(A<0)^(B<0)}
bench.report(“!=”){N.times{(A>=0)!=(B>=0)}
bench.report('如果它很重要,我可能会把它补上;只有AFAIK的BigNum有一个符号方法。什么是c
?什么是a
,b
?最重要的是,你的问题是什么?@sawa-我试图找到最短、最优雅的方法来执行条件运算(就像翻转数字上的符号:c=-c
)当a(一个有符号的Fixnum)与b(另一个有符号的Fixnum)具有相反的符号时因此,如果a=-34和b=7,那么c将=-c。如果这很重要,我可能会把它补上;只有AFAIK BigNum才有一个符号
方法。什么是c
?什么是a
,b
?最重要的是,你的问题是什么?@sawa-我正在试图找到执行条件运算的最短、最优雅的方法(就像翻转数字上的符号:c=-c
)当a(一个有符号的Fixnum)与b(另一个有符号的Fixnum)有相反的符号时。因此,如果a=-34和b=7,那么c将=-c。比较布尔值不是个坏主意。谢谢。我相信:c=-c如果(是的,这取决于你想成为哪一个true
。比较布尔值不是一个坏主意。谢谢。我相信:c=-c如果(是的,这取决于你想成为哪一个true
。谢谢。这是一个很好的、简短的解决方案。我将以c=-c如果为基准测试它。)(aI想知道哪一个会更快,除非你称之为多(百万)次,没关系。主要的是使用对你来说更容易或更清晰的方法。我用它来切换音频滤波器的振幅。所以,事实上,我会多次调用它。谢谢。这是一个很好的、简短的解决方案。如果(aI想知道哪一个会更快,除非你称之为多(百万)几次都没关系。主要的是用哪一个对你来说更容易或更清晰。我用它来切换音频滤波器的振幅。所以,事实上,我会无数次地叫它。哇。太好了!非常感谢你!我还没有足够的“声誉”来支持投票。哇…ruby 2.0很快!我不认为有什么优势任何阻止我使用它的东西。谢谢你,铁皮人。10000000个循环是3:28秒的音频。你看,循环建立得很快!哇。太好了!非常感谢!我还没有足够的“声誉”去投票。哇…ruby 2.0很快!我认为没有任何东西阻止我使用它。谢谢你,铁皮人。10,000000循环是3:28秒的音频。所以你看,循环建立得很快!