Zamierzam przekonwertować zakres MIN_SAFE_INTEGER
do MAX_SAFE_INTEGER
zakresu kodu JavaScript (53-bitów bez znaku) na ciąg bitów rozłożonych na 7 bajtów przesuniętych o dwa, aby umożliwić identyfikatory znaków i puste.Najszybszy sposób konwersji liczb całkowitych na dowolnie uporządkowane tablice bajtów w JavaScript?
dotąd najlepszy mam wymyślić to:
function toUint8Array(data) {
data = data.toString(2);
data = new Array(65 - data.length).join('0') + data;
var ret = new Uint8Array(data.length/8);
for (var i = 0; i < 8; i++) {
ret[i] = 0;
ret[i] += (data[i * 8] == '1' ? 128 : 0);
ret[i] += (data[(i * 8) + 1] == '1' ? 64 : 0);
ret[i] += (data[(i * 8) + 2] == '1' ? 32 : 0);
ret[i] += (data[(i * 8) + 3] == '1' ? 16 : 0);
ret[i] += (data[(i * 8) + 4] == '1' ? 8 : 0);
ret[i] += (data[(i * 8) + 5] == '1' ? 4 : 0);
ret[i] += (data[(i * 8) + 6] == '1' ? 2 : 0);
ret[i] += (data[(i * 8) + 7] == '1' ? 1 : 0);
}
return (ret);
}
Jak można powiedzieć tuż, to byłoby okropnie wolno (a bity wciąż nie zostały przesunięte dwa miejsca na wszystkie 7 aktywnych bajtów.)
Czy jest jakiś sposób, aby to zrobić szybciej? Idealnie unikając parsowania napisów w ogóle?
Właściwie DataView, ** poprawnie użyty ** tzn. Nie w jaki sposób próbowałeś, może dać skromną (3X w przeglądarce Firefox, 1.5X w Chrome, ** 7,5X ** w przeglądarce internetowej) poprawę szybkości - i może robię to suboptymalnie –
@JaromandaX Byłbym ciekawy, jak sobie z tym radzisz, aby uzyskać wynik, który próbuję uzyskać. – CoryG
Potrafię zrobić skrzypce, ale ... dane wejściowe są ściśle ograniczone do MIN_SAFE_INTEGER -> MAX_SAFE_INTEGER - jedno pytanie ... czy bity sign/null to LSB z 7 bajtu czy MSB z pierwszego bajtu? –