10進数からバイトに変換しているので、256で除算することは、文字列内の数値を部分に分割することで非常に簡単にシミュレートできる操作です。利用できる数学的規則は2つあります。
- 10進数の右端のn桁は、2^nで除算可能性を決定できます。
- 10^nは常に2^nで割り切れます。
したがって、数値を取得し、右端の8桁を除算して余り(つまり、& 255
)を見つけ、右側を256で除算してから、数値の左側を256で個別に除算することができます。左の部分の余りは、式によって数値の右の部分(右端の8桁)にシフトできますn*10^8 \ 256 = (q*256+r)*10^8 \ 256 = q*256*10^8\256 + r*10^8\256 = q*10^8 + r*5^8
。ここで、\
は整数の除算でありq
、r
はそれぞれ商と余りですn \ 256
。これにより、次のメソッドが生成され、最大23桁の文字列(通常のJS精度15 +このメソッドによって生成される追加の8)の長さが256で整数除算されます。
function divide256(n)
{
if (n.length <= 8)
{
return (Math.floor(parseInt(n) / 256)).toString();
}
else
{
var top = n.substring(0, n.length - 8);
var bottom = n.substring(n.length - 8);
var topVal = Math.floor(parseInt(top) / 256);
var bottomVal = Math.floor(parseInt(bottom) / 256);
var rem = (100000000 / 256) * (parseInt(top) % 256);
bottomVal += rem;
topVal += Math.floor(bottomVal / 100000000); // shift back possible carry
bottomVal %= 100000000;
if (topVal == 0) return bottomVal.toString();
else return topVal.toString() + bottomVal.toString();
}
}
技術的には、これは、任意のサイズの整数を256で除算するために実装できます。これは、数値を8桁の部分に再帰的に分割し、同じ方法を使用して各部分の分割を個別に処理するだけです。
45035997012373300
これは、サンプル番号( )の正しいバイト配列を計算する実用的な実装です:http: //jsfiddle.net/kkX2U/。
[52, 47, 7, 44, 0, 0, 160, 0]