我正在尝试移植一些代码,现在我遇到了一个棘手的问题。原始代码是用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))
这是这样做的吗?字符串操作似乎很昂贵。任何建议表示赞赏。
答案 0 :(得分:5)
我也主要来自C / C ++编程,这就是我要解决的问题:
首先,创建一个包含两个UInt32
元素的不可变类型:
immutable MyType
a::UInt32
b::UInt32
end
然后,您可以使用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
注意:两个向量仍指向相同的内存,因此您甚至可以使用任何一种类型更新元素。
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