5

ビットを操作して加算、減算、除算、乗算する方法を理解しようとしています。

イベントが発生した後に多くの計算が実行されるため、JavaScript プログラムでいくつかの最適化を行う必要があります。

以下のコードを参考にすると、キャリーが &ing 値を保持していることがわかります。次に、合計変数を各 n1 / n2 変数で一致しないビットに設定する XOr を実行します。

これが私の質問です.;) (n1 & n2)<<1 を 1 ずつシフトするとどうなりますか? これを行うことによる目標は何ですか?XOr と同様に、これらのビットで他に何もする必要がないことは明らかです。これらのビットの 10 進値は、合計変数にあるため問題ありません。& shift 操作によって何が達成されているのか、頭の中で想像できません。

function add(n1,n2)
{
        var carry, sum;

        // Find out which bits will result in a carry.
        // Those bits will affect the bits directly to
        // the left, so we shall shift one bit.
        carry = (n1 & n2) << 1;

        // In digital electronics, an XOR gate is also known
        // as a quarter adder.  Basically an addition is performed
        // on each individual bit, and the carry is discarded.
        //
        // All I'm doing here is applying the same concept.
        sum = n1 ^ n2;

        // If any bits match in position, then perform the
        // addition on the current sum and the results of
        // the carry.
        if (sum & carry)
        {
                return add(sum, carry);
        }

        // Return the sum.
        else
        {
                return sum ^ carry;
        };
};

上記のコードは期待どおりに機能しますが、浮動小数点値を返しません。浮動小数点値とともに合計を返す必要があります。

浮動小数点値を扱うのに役立つ、上記で使用できる関数を誰かが持っていますか? 私が探しているものを明確に説明しているウェブサイトはありますか? 最終日を検索してみましたが、見に行くものが見つかりません。

このリソースから上記のコードを取得しました。 http://www.dreamincode.net/code/snippet3015.htm

お早めにどうぞ!

それについて考えた後、左シフトを 1 の位置に行うことは 2 の乗算です。

次のように &ing することにより:キャリー = (n1 & n2) << 1; キャリー変数は、n1 と n2 の一致した位置からコンパイルされたバイナリの文字列を保持します。したがって、n1 が 4 で n2 が 4 の場合、両方とも同じ値を保持します。したがって、2 つを結合して 1 インデックスに右シフトすると、4 x 2 = 8 が乗算されます。したがって、キャリーは 8 になります。

1.) var キャリー = 00001000 =8 & 00001000 =8

2.) キャリー = 00001000 = 8 の単一の値を保持するようになりました

左シフトは 8 x 2 =16、または 8 + 8 = 16 を乗算します。

3.)carry = キャリー <<1 、すべてのビットを 1 つの位置にシフトする

4.) キャリーは 00010000 = 16 の単一の値を保持するようになりました

浮動小数点値の操作についてはまだ何も見つかりません。誰かが何かを持っている場合は、リンクを投稿してください。

4

2 に答える 2

3

コードは浮動小数点数が整数で表されていると想定しているため、機能しません。浮動小数点数は、IEEE 754 標準を使用して表されます。これは、数値を 3 つの部分に分割します:符号ビット、指数を表すビットのグループ、および 1 (包括的) と 2 (排他的) の間の数値を表す別のグループ、仮数、値は次のように計算されます。

(sign is set ? 1 : -1) * (mantissa ^ (exponent - bias))

バイアスは浮動小数点数の精度に依存します。そのため、2 つの数値を加算するために使用するアルゴリズムは、ビットが整数を表すと仮定しますが、これは浮動小数点数には当てはまりません。また、ビットごとの AND やビットごとの OR などの演算でも、整数の世界で期待される結果は得られません。

いくつかの例では、倍精度では、数値 2.3 は (16 進数で) 4002666666666666 として表され、数値 5.3 は 4015333333333333 として表されます。これら 2 つの数値を OR すると、4017777777777777 が得られ、これは (おおよそ) 5.866666 を表します。

この形式にはいくつかの良い指針があります。リンクはhttp://www.psc.edu/general/software/packages/ieee/ieee.phphttp://babbage.cs.qc.edu/IEEE-にあります。 754/http://www.binaryconvert.com/convert_double.htmlは、それを理解するのにかなり適しています。

これらの数値のビットごとの加算をまだ実装したい場合は、実行できます。ただし、数値をその部分に分解し、同じ指数で数値を正規化し (そうしないと加算できません)、仮数で加算を実行し、最後に IEEE754 に正規化する必要があります。フォーマット。しかし、@LukeGT が言ったように、実行している JS エンジンよりも優れたパフォーマンスは得られないでしょう。また、一部の JS 実装では、浮動小数点数のビット単位の操作さえサポートしていないため、通常、最初に数値を整数にキャストしてから操作を実行すると、結果が不正確になります。

于 2012-05-08T21:58:13.033 に答える
1

浮動小数点値は複雑なビット構造を持ち、ビット操作で操作するのは非常に困難です。結果として、それらを計算する上で Javascript エンジンよりも優れているとは思えません。浮動小数点の計算は本質的に遅いため、速度が心配な場合は避けるようにしてください。

代わりに、整数を使用して 10 進数を x 桁まで表現してみてください。たとえば、通貨を扱っている場合、小数の値を持つドルではなく、セント単位で物事を保存できます。

それが役立つことを願っています。

于 2012-05-08T12:42:45.653 に答える