什么了不起的问题!这里有一个办法做到这一点没有不安全的代码:
public struct LongAndBytes
{
[FieldOffset(0)]
public ulong UlongValue;
[FieldOffset(0)]
public byte Byte0;
[FieldOffset(1)]
public byte Byte1;
[FieldOffset(2)]
public byte Byte2;
[FieldOffset(3)]
public byte Byte3;
[FieldOffset(4)]
public byte Byte4;
[FieldOffset(5)]
public byte Byte5;
[FieldOffset(6)]
public byte Byte6;
[FieldOffset(7)]
public byte Byte7;
public byte[] ToArray()
{
return new byte[8] {Byte0, Byte1, Byte2, Byte3, Byte4, Byte5, Byte6, Byte7};
}
}
// ...
LongAndBytes lab = new LongAndBytes();
lab.UlongValue = 0;
do {
// stuff
lab.UlongValue++;
} while (lab.ULongValue != 0);
每个成员字节0 ...字节7重叠了ulong,分享它的成员。这不是一个数组 - 我试图用这种方法来解决问题,结果并不理想。我敢打赌,有人知道这个魔术宣言是如何实现的。我可以做一个P/Invoke,但不能在.NET中使用,因为数组是一个对象。
要测试所有2^64组合将需要很长时间。 – 2009-09-18 12:15:18
如果你真的对每个组合进行了一些处理,它将花费大约七年的时间来循环组合。蛮力似乎不是正确的方法... – Guffa 2009-09-18 13:25:55
是的,除非你拥有政府机构或大公司的计算资源,否则你没有机会彻底地测试2^64大小的搜索空间。即使每个测试只用一个周期来运行现代CPU,也需要71万年时间才能完成整个搜索空间的测试。 – 2009-09-18 14:08:38