GoLang中的地址按位XOR

问题描述 投票:1回答:3

我试图在Go中实现XOR链接列表,我必须存储XORed地址。在C / C ++中,它非常简单

(*struct_type)(([unsigned] int)nodeA ^ ([unsigned] int)nodeB)

我在Go尝试了类似的方法。我有一个名为Node的结构,有两个节点nodeA和nodeB。为此,我尝试了以下方法:

*Node(uint(nodeA) ^ uint(nodeB))

这给了我一个错误说,无法将类型Node转换为uint。我尝试的另一种方式,我确信不起作用,是

nodeA ^ nodeB

有没有办法将地址解析为int类型,对它们进行异或,然后将它们重新解析为Node地址?或者Go是否提供了一个我不知道的简单解决方案?

pointers go bit-manipulation xor
3个回答
2
投票

使用unsafe.Pointer进行指针运算:

a := &T{}
b := &T{}
x := uintptr(unsafe.Pointer(a)) ^ uintptr(unsafe.Pointer(b))
y := (*T)(unsafe.Pointer(uintptr(unsafe.Pointer(a)) ^ x))
fmt.Println(b == y)  // prints true

GC使用指针来跟踪内存。如果代码被重写为

a := &T{}
b := &T{}
x := uintptr(unsafe.Pointer(a)) ^ uintptr(unsafe.Pointer(b))
b = nil // clear all pointers to struct
b = (*T)(unsafe.Pointer(uintptr(unsafe.Pointer(a)) ^ x))

那么GC可能会在最后一次分配给b之前收集b指向的结构。

由于GC可以收集元素,因此无法在Go中实现安全的XOR列表。

不要这样做。


3
投票

您无法在Go中实现XOR链接列表。 Go垃圾收集器(GC)使用指针值来跟踪正在使用的内存。如果您修改指针值,GC将无法工作。


0
投票

感谢您指出Go不支持指针运算。我做了一个快速的研究,发现并使用了美国包装Go提供以防万一“需要时不安全”的工作。我用以下几行代码解决了这个问题:

a := unsafe.Pointer(nodeA)
b := unsafe.Pointer(nodeB)
return (*Node)(unsafe.Pointer(uintptr(a) ^ uintptr(b)))

docs到不安全的包裹。

© www.soinside.com 2019 - 2024. All rights reserved.