将XORShift算法从C代码转换为Delphi代码

时间:2015-10-11 13:40:26

标签: c delphi

我在C中有代码,我想将其转换为Delphi。我所做的是对还是错?

uint64_t s[ 16 ];
int p;

uint64_t next(void) {
  uint64_t s0 = s[ p ];
  uint64_t s1 = s[ p = ( p + 1 ) & 15 ];
  s1 ^= s1 << 31; // a
  s1 ^= s1 >> 11; // b
  s0 ^= s0 >> 30; // c
  return ( s[ p ] = s0 ^ s1 ) * 1181783497276652981LL;

德尔福代码:

Function next() : UInt64;
var 
  s : array of UInt64;
  s0, s1 : UInt64;
  p : integer;
begin 
  SetLength(s, 16);
  s0 := s[p];
  p := ( p + 1 ) and 15;
  s1 := s[p];
  s1 := s1 xor (s1 shl 31);
  s1 := s1 xor (s1 shr 11);
  s0 := s0 xor (s0 shr 30);
  s[p] := (s0 xor s1) * 1181783497276652981;
  result := s[p]; 
end;

1 个答案:

答案 0 :(得分:0)

您的翻译在很多方面都是错误的。除此之外,您的Delphi代码无法编译,实际上也没有C代码。

该功能的结尾应该是:

s[p] := s0 xor s1;
Result := s[p] * 1181783497276652981;

在这里使用堆分配的数组是浪费的。请改用固定长度的数组。

我可以看到的另一个问题是sp在C代码中的范围比Delphi代码更广。我们无法看到它们是如何在C代码中初始化的,因为很遗憾,您删除了许多重要的代码。显然,您的Delphi代码无法使用这种差异。在C代码中s意味着在不同的调用之间保持不变。同样p

也许代码应该是:

var 
  s: array [0..15] of UInt64;
  p: Integer;

function next() : UInt64;
var
  s0, s1 : UInt64;
begin 
  s0 := s[p];
  p := ( p + 1 ) and 15;
  s1 := s[p];
  s1 := s1 xor (s1 shl 31);
  s1 := s1 xor (s1 shr 11);
  s0 := s0 xor (s0 shr 30);
  s[p] := s0 xor s1;
  Result := s[p] * 1181783497276652981;
end;

但同样,我们不知道sp是如何初始化的。你呢?

您需要做的是进行一些测试。比较两个程序的输出。如果他们同意,那很好。如果他们不这样做,请调试Delphi程序以找出它的分歧。