既存のデータを保持し、CPU レジスタのサイズに一致するバッファを使用して、メモリ内のバイトをある位置から別の位置に移動するにはどうすればよいですか?
より正確な定式化:
FreePascal を使って (楽しみのために) コードを書いています。そして現時点では、ある程度のバイトを他の場所に移動する機能が必要です。組み込み関数 system.Move は失礼なことをしています - 移動してオーバーライドするときに宛先アドレスのデータを保持することを気にしません。もちろん、バッファを使用してデータを保存し、Move 関数を使用してバッファからデータを復元することもできます。ただし、大量のデータを移動する場合は、大きなバッファーが必要になります。それを避けて、CPUレジスタサイズに一致するバッファを使用したい。
常に低い位置から高い位置 (Pos1 < Pos2) に移動するという前提で必要なものの例。位置 2 から位置 7 に 3 バイトを移動します。
バイトサイズのバッファを使用してそれを行うことができます(→平均書き込み、↔平均交換値):
7 → Buffer
2 → 7
Buffer ↔ 4
Buffer ↔ 9
Buffer ↔ 6
Buffer ↔ 3
Buffer ↔ 8
Buffer ↔ 5
Buffer ↔ 2
より大きな例: 3 バイトを位置 3 から位置 15 に移動します。
アルゴリズムは次のようになります。
15 → Buffer
3 → 15
Buffer ↔ 12
Buffer ↔ 9
Buffer ↔ 6
Buffer ↔ 3
16 → Buffer
4 → 16
Buffer ↔ 13
Buffer ↔ 10
Buffer ↔ 7
Buffer ↔ 4
17 → Buffer
5 → 17
Buffer ↔ 14
Buffer ↔ 11
Buffer ↔ 8
Buffer ↔ 5
前の例では、1 つの大きなステップがありました。1 つの操作シーケンスを使用してすべてを移動しますが、ここでは 3 つの大きなステップがあります。
私が理解していない方法で-そのような大きなステップの数は、(Pos2-Pos1) と長さの GCD (最大公約数) に等しいようです。
特定の移動要求に対して正しい操作シーケンスを提供するように見えるいくつかのpythonコードを記述します
# -*- coding: utf-8 -*-
def func1(Pos1, Pos2, Length):
Delta = Pos2 - Pos1;
j = Pos2;
p1 = Pos1;
p2 = Pos2;
Step = 0;
SubStep = 0;
while (Step < Delta + Length):
Step = Step + 1;
SubStep = SubStep + 1;
print(" %d → Buffer"%j);
print(" %d → %d"%(p1,j));
while 1:
Step = Step + 1;
if (j + Delta < Pos2 + Length):
j = j + Delta;
else:
j = j - Length;
print(" Buffer ↔ %d"%(j));
if (j == p1):
p1 = p1 + 1;
p2 = p2 + 1;
j = p2;
break;
return SubStep;
これが正しいと仮定すると、大きな問題が 1 つあります。このアルゴリズムは、遅いバイト操作を処理します。私は amd64 を使用しているため、操作ごとに 8 バイトで動作するようにしたいと考えています。
どうやってそれをするつもりですか?