0

OpenInsight 8 でビットごとのシフト (算術ではなく論理) を実装する必要があります。

システムではほとんどすべてが文字列ですが、数値を 32 ビット整数として扱う関数が 4 つあります。使用可能なビット関数は、AND、OR、NOT、および XOR です。算術演算子は、数値を符号付きとして扱います。

現在、SHA-1 を実装するために必要な左シフトと右シフトの実装に問題があります。

これを達成するのに役立つアルゴリズムを誰かが提案できますか? 疑似コードで十分です。一般的なアイデアが必要なだけです。

4

3 に答える 3

1

整数の乗算と除算を使用してシフトを実装できます。

左シフト = *2

右シフト = /2

おそらく、整数のオーバーフローを防ぐために、最上位ビットをゼロにするために最初に数値をマスクする必要があります。

于 2012-08-21T12:42:23.733 に答える
0

論理的な右シフトがない場合は、算術的に n ビットを右シフトし、上位 n ビットをクリアすることで簡単に実現できます。

例: 右に 2 ビットシフト:

x >= 2;
x &= 0x3fffffff;

n ビット右シフト

x >= n;
x &= ~(0xffffffff << (32 - n));
// or
x >= n;
x &= (1 << (32 - n)) - 1;

左シフトの場合、それらはすべて同じであるため、論理的/数学的な区別はありません.0をシフトするだけです.

于 2013-07-28T12:32:43.053 に答える
0

符号付き算術演算とビット演算を使用して 1 ビット下に論理シフト

v < 0 の場合
   v = v & 0x7ffffffff // トップビットをクリア
   v = v / 2 //残りを下にシフト
   v = v + 0x40000000 // 最後から 2 番目のビットを設定する
そうしないと
   v = v / 2
フィ

于 2013-07-12T08:18:43.120 に答える