3

いくつかのビットシフト操作を実行し、JavaScript で 2 進数を処理しようとしています。

これが私がやろうとしていることです。ユーザーが値を入力すると、それを使用して次のことを行います。

// Square Input and mod with 65536 to keep it below that value
var squaredInput = (inputVal * inputVal) % 65536;
// Figure out how many bits is the squared input number
var bits = Math.floor(Math.log(squaredInput) / Math.log(2)) + 1;
// Convert that number to a 16-bit number using bitshift.
var squaredShifted = squaredInput >>> (16 - bits);

数値が 46 より大きい限り、機能します。46 未満になると機能しません。私は問題がビットシフトであることを知っています。現在、C のバックグラウンドを持っているため、すべての数値が 32 ビット形式で格納されるため、これは別の方法で行われることがわかっています (それがint. JavaScript は同じことを行いますか (var型付けされていないため)?

もしそうなら、16ビットの数値を格納することは可能ですか? そうでない場合、それを 32 ビットとして扱い、16 ビットであると仮定するために必要な計算を行うことはできますか?

注: の 16 ビット値の中間の 4 ビットを抽出しようとしていますsquaredInput

別の注意: var を出力すると、パディングなしで値が出力されるだけなので、わかりませんでした。と を使用parseIntしてみtoStringました。

ありがとう

4

2 に答える 2

1

これを探していますか?

function get16bitnumber( inputVal ){
   return ("0000000000000000"+(inputVal * inputVal).toString(2)).substr(-16);
}

この関数は、値の最後の 16 ビットを返します(inputVal*inputVal)。バイナリ文字列を使用すると、任意の範囲のビットを処理できます。

于 2012-04-17T20:34:40.083 に答える
0

絶対に必要でない場合は、JS でビットシフトを使用しないでください。仕様には、少なくとも 4 つの数値形式が記載されています

  • IEEE754
  • Int32
  • UInt32
  • UInt16

どれがいつ使われるかを知るのは本当に混乱します。

たとえば、~Int32 への変換中にビット単位の反転を適用します。UInt16 は でのみ使用されているようString.fromCharCodeです。ビットシフト演算子を使用すると、オペランドが UInt32 または Int32 に変換されます。

あなたの場合、右シフト演算子>>> は UInt32 への変換を強制します。入力するとき

a >>> b

これはあなたが得るものです:

ToUInt32(a) >>> (ToUInt32(b) & 0x1f)
于 2012-04-17T21:25:32.633 に答える