将四个8位无符号整数合并为一个32位无符号整数

杰瑞德·贝克(Jared Beck)

给定一个由四个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 ++问题:

将两个短裤组合为一个int的最干净方法

我认为这<<是一个“转变”,|也是一个“蒙版”,但我对这些运算符了解不足,也从未在红宝石中使用过它们。

八月

将每个元素移动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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将四个字节转换为32位无符号整数

c ++将四个无正弦的字符转换为一个无符号整数

如何将一个无符号长整数(32位)拆分为8个半字节?

用两个无符号的16位整数表示一个无符号的32位值

在 Perl 中以 4 个无符号字符解码 32 位无符号整数

如何将16位无符号整数转换为较大的8位无符号整数?

C:如何将2个32位无符号整数的结果保存为有符号整数

是否有一个非循环的无符号32位整数平方根函数C

为什么将两个32位整数合并为一个64位整数?

无符号8位整数的左移运算

如何将 16 位无符号整数转换为 8 位无符号字符并最终返回无符号字符*?

24位无符号整数

如何将32位带符号整数转换为64位无符号整数的高32位?

32位无符号整数的2位右移

将32位整数值转换为无符号16位整数

使用8位无符号整数变量作为计数器循环遍历256个值

从char数组转换为16位有符号整数和32位无符号整数

64位向量的点乘积比32位无符号整数的向量快一倍?

提取无符号32位整数的高位和低位字

找一个32位无符号偏移量

c中的3位无符号整数

以无符号16位整数存储RGB

设置无符号整数的第n位

Clojure中的无符号16位整数

将两个32位整数转换为一个带符号的64位整数字符串

如何在AVX2中从32位无符号整数转换为16位无符号整数?

将int转换为16位无符号短整数

为什么 16 位和 32 位整数的有符号和无符号加法转换不同?

如何从32位R整数中提取4位无符号整数?