给定一个由四个8位无符号整数组成的数组,例如32位RGBA颜色
rgba = [255, 255, 255, 255] # white
将这四个Fixnum组合成单个32位Integer的最有效方法是什么?
目前,我正在使用打包和解包:
rgba.pack('C*').unpack('L')[0] #=> 4294967295
# Check work: same value as corresponding hex literal
0xffffffff #=> 4294967295
但我想知道是否有更有效的方法。我发现了这个C ++问题:
我认为这<<
是一个“转变”,|
也是一个“蒙版”,但我对这些运算符了解不足,也从未在红宝石中使用过它们。
将每个元素移动24-(index * 8),然后将它们全部或在一起:
rgba = [255, 255, 255, 255]
rgba[0] << 24 | rgba[1] << 16 | rgba[2] << 8 | rgba[3]
我没有移动,rgba[3]
因为移动零没有任何作用。
一些测量:
使用 unpack
Benchmark.measure do
100_000.times do
rgba = [255, 255, 255, 255]
rgba.pack('C*').unpack('L')[0]
end
end
结果:
=> #<Benchmark::Tms:0x007fe137005350
@cstime=0.0,
@cutime=0.0,
@label="",
@real=0.146899,
@stime=0.0,
@total=0.1399999999999999,
@utime=0.1399999999999999>
使用按位运算符
Benchmark.measure do
100_100.times do
rgba = [255, 255, 255, 255]
rgba[0] << 24 | rgba[1] << 16 | rgba[2] << 8 | rgba[3]
end
end
结果:
=> #<Benchmark::Tms:0x007fd66438fd28
@cstime=0.0,
@cutime=0.0,
@label="",
@real=0.088995,
@stime=0.0,
@total=0.08000000000000007,
@utime=0.08000000000000007>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句