如何将C ++联盟移植到Julia

时间:2016-11-19 17:58:36

标签: julia

我正在尝试移植一些代码,现在我遇到了一个棘手的问题。原始代码是用C ++编写的。我需要移植一个具有两个32位整数(在一个数组中)和一个双精度的联合。

到目前为止,我有:

I1 = UInt32(56) # arbitrary integer values for example
I2 = UInt32(1045195987)
# do transforms on I1 and I2 as per the code I'm porting
A = bits(I1)
B = bits(I2)
return parse(Float64, string(A,B))

这是这样做的吗?字符串操作似乎很昂贵。任何建议表示赞赏。

1 个答案:

答案 0 :(得分:5)

我也主要来自C / C ++编程,这就是我要解决的问题:

首先,创建一个包含两个UInt32元素的不可变类型:

immutable MyType
    a::UInt32
    b::UInt32
end

然后,您可以使用Float64reinterpret的向量转换为该类型。

例如:

julia> x = [1.5, 2.3]
2-element Array{Float64,1}:
 1.5
 2.3

julia> immutable MyType ; a::UInt32 ; b::UInt32 ; end

julia> y = reinterpret(MyType, x)
2-element Array{MyType,1}:
 MyType(0x00000000,0x3ff80000)
 MyType(0x66666666,0x40026666)

julia> x[1]
1.5

julia> y[1]
MyType(0x00000000,0x3ff80000)

julia> y[1].a
0x00000000

julia> y[1].b
0x3ff80000

注意:两个向量仍指向相同的内存,因此您甚至可以使用任何一种类型更新元素。

julia> x[1] = 10e91
1.0e92

julia> y[1].a
0xbf284e24

julia> y[1].b
0x53088ba3

julia> y[1] = MyType(1,2)
MyType(0x00000001,0x00000002)

julia> x[1]
4.2439915824e-314