3

問題は次のとおりです。符号付き整数(MSBは符号、値は2の補数の2進値)として正確にエンコードされた数値を処理する必要がありますが、32ビットではありません。つまり、21ビットの2進値があり、20番目のビットが符号で、ビット19〜0が数値コードを表すように処理する必要があります。そして、私は次のようなことをする必要があります

int<21>a = 200000
int<21>b = 300000
int<21>c = a + b

ターゲット言語はjavascriptです。つまり、ビット単位の加算/シフトなどのすべての標準的な二項演算を使用できます。単純なアルゴリズムはありますか?

4

2 に答える 2

1

本来、21ビットの整数を持つことはできません。ただし、2 ^ 20未満の整数が必要なため、ビット0〜19に収まるほど小さいです。
詳細情報がなければ、すべての整数に2 ^ 20=1048576を符号として追加することをお勧めします。次に、それらを使用して操作を行うときは注意する必要があるため、2 ^ 20を記号として、基本的な数学演算を自分で実装します。

于 2013-03-25T12:49:00.587 に答える
0

しばらく経ちましたが、他の誰かが必要とする場合に備えて、結果のjavascriptコードをここに残しておきます。この関数は、32ビットのint値をNビットのintに変換します。

function 32BitsToN (intValue) {
  var retVal=0;
  var leftMask = 0;

  var flag = (1 << N-1);
    if ((value & flag )!= 0) { //Nth bit is set, the value is negative.
      //WScript.Echo('NEGATIVE!\n');
      //WScript.Echo('Incoming: '+value)
      //we need to set all bits N-32 to 1
  for (var i = 1; i<= (32-N); i++) {
    leftMask |= 1<<32-i;
  }

    retval = value | leftMask;      
    //incoming: |1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|x|x|x|x|x|
    //Mask:     |1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|0|0|0|0|0|0|
    //result:   |0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|x|x|x|x|x|

  } else {
    retval = value;
  }

return retval;

}
于 2013-12-20T13:07:42.010 に答える