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

Pet*_*ini 3 julia

我正在尝试移植一些代码,现在我已经碰了一下.原始代码是用C++编写的.我需要移植一个具有两个32位整数(在一个数组中)和一个double的联合.

到目前为止,我有:

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))
Run Code Online (Sandbox Code Playgroud)

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

Sco*_*nes 5

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

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

immutable MyType
    a::UInt32
    b::UInt32
end
Run Code Online (Sandbox Code Playgroud)

然后你可以转换Float64为该类型的向量reinterpret.

例如:

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)