gpt4 book ai didi

ruby - 将 4 个 8 位 unsigned int 合并为 1 个 32 位 unsigned int

转载 作者:数据小太阳 更新时间:2023-10-29 08:03:54 25 4
gpt4 key购买 nike

给定一个包含四个 8 位无符号整数的数组,例如 32-bit RGBA color

rgba = [255, 255, 255, 255] # white

结合这四种方法最有效的方法是什么Fixnums成单个 32 位 Integer

目前,我正在使用打包和解包:

rgba.pack('C*').unpack('L')[0] #=> 4294967295

# Check work: same value as corresponding hex literal
0xffffffff #=> 4294967295

但我想知道是否有更有效的方法。我发现了这个 C++ 问题:

Cleanest way to combine two shorts to an int

我认为 <<是一个“转变”和|是一个“掩码”,但我对这些运算符了解不够,也从未在 ruby​​ 中使用过它们。

最佳答案

将每个元素移动 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>

关于ruby - 将 4 个 8 位 unsigned int 合并为 1 个 32 位 unsigned int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27436994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com