Baseline Widely available
æ¦è¿°Math.clz32()
彿°è¿åä¸ä¸ªæ°åå¨è½¬æ¢æ 32 æ ç¬¦å·æ´å½¢æ°åçäºè¿å¶å½¢å¼åï¼å¼å¤´ç 0 ç个æ°ï¼æ¯å¦ 1000000
è½¬æ¢æ 32 使 ç¬¦å·æ´å½¢æ°åçäºè¿å¶å½¢å¼åæ¯ 00000000000011110100001001000000
, å¼å¤´ç 0 çä¸ªæ°æ¯ 12 个ï¼å Math.clz32(1000000)
è¿å 12
.
"clz32" æ¯ CountLeadingZeroes32 ç缩åã
妿 x
䏿¯æ°åç±»åï¼åå®é¦å
ä¼è¢«è½¬æ¢ææ°åç±»åï¼ç¶åå转æ 32 使 ç¬¦å·æ´å½¢æ°åã
å¦æè½¬æ¢åç 32 使 ç¬¦å·æ´å½¢æ°åæ¯ 0
, åè¿å 32
, å ä¸ºæ¤æ¶ææä½ä¸é½æ¯ 0
.
NaN
, Infinity
, -Infinity
è¿ä¸ä¸ªæ°å转æ 32 使 ç¬¦å·æ´å½¢æ°åå齿¯ 0
.
è¿ä¸ªå½æ°ä¸»è¦ç¨äºé£äºç¼è¯ç®æ 为 JS è¯è¨çç³»ç»ä¸ï¼æ¯å¦ Emscripten.
示ä¾Math.clz32(1); // 31
Math.clz32(1000); // 22
Math.clz32(); // 32
const stuff = [
NaN,
Infinity,
-Infinity,
0,
-0,
false,
null,
undefined,
"foo",
{},
[],
];
stuff.every((n) => Math.clz32(n) === 32); // true
Math.clz32(true); // 31
Math.clz32(3.5); // 30
计ç®å导 1 ç个æ°
ç®å javascript å°æªæä¾ Math.clon
彿°æ¥è®¡ç®å导 1 ç个æ°ï¼ä¹æä»¥å«âclonâèéâcloâï¼æ¯å 为âcloâä¸âclzâ太è¿ç¸ä¼¼ï¼ç¹å«å¯¹é£äºæ¯è¯ä¸æ¯è±è¯ç人æ¥è¯´ï¼ï¼ä½æ¯ä½ å¯ä»¥éè¿å°ä¸ä¸ªæ°ååå¹¶å°å
¶ä½ä¸º Math.clz32
çåæ°æ¥å®ç° clon 彿°ãå
¶ä¸çåçé常ç®åï¼å 为对 1 å忝 0ï¼åä¹äº¦ç¶ï¼æä»¥ç¨ Math.clz32
计ç®å导 0 ç个æ°å°±åæè®¡ç®å导 1 ç个æ°ã
å ç以ä¸ä»£ç ï¼
const a = 32776; // 00000000000000001000000000001000ï¼16 个å导 0ï¼
Math.clz32(a); // 16
const b = ~32776; // 11111111111111110111111111110111ï¼å¯¹ 32776 ååï¼0 个å导 0ï¼
Math.clz32(b); // 0ï¼è¿ä¸ a 䏿å¤å°ä¸ªå导 0 çä»·ï¼
éè¿ä»¥ä¸æ¹æ³ï¼clon
彿°å¯ä»¥å®ä¹å¦ä¸ï¼
const clz = Math.clz32;
function clon(integer) {
return clz(~integer);
}
ç°å¨ï¼æä»¬å¯ä»¥è¿ä¸æ¥å®ç°è®¡ç®âå°¾é 0âåâå°¾é 1âç个æ°äºãä¸é¢ç ctrz
彿°å°ç¬¬ä¸ä¸ª 1 ä¹åç髿°ä½å
¨é¨ç½®ä¸º 1 ç¶åååï¼åç¨ Math.clz32
æ±å¾å°¾é 0 ç个æ°ã
var clz = Math.clz32;
function ctrz(integer) {
// 计ç®å°¾é 0 个æ°
// 1. å°ç¬¬ä¸ä¸ª 1 ä¹åç髿°ä½å
¨é¨ç½®ä¸º 1
// 00000000000000001000000000001000 => 11111111111111111111111111111000
integer |= integer << 16;
integer |= integer << 8;
integer |= integer << 4;
integer |= integer << 2;
integer |= integer << 1;
// 2. ç¶åï¼å¯¹è¯¥æ°ååï¼æ¤æ¶ä½ä½ç 1 ç个æ°å³ä¸ºææ±
return (32 - clz(~integer)) | 0; // `| 0` ç¨äºä¿è¯ç»æä¸ºæ´æ°
}
function ctron(integer) {
// 计ç®å°¾é 1 个æ°
// JavaScript 䏿²¡æç§»ä½è¡¥ 1 çè¿ç®ç¬¦
// æä»¥ä¸é¢çä»£ç æ¯æå¿«ç
return ctrz(~integer);
/* 为äºçèµ·æ¥æ¯è¾å¯¹ç§°ï¼ä½ ä¹å¯ä»¥ä½¿ç¨ä»¥ä¸ä»£ç ï¼
// 1. å°ç¬¬ä¸ä¸ª 0 ä¹åç髿°ä½å
¨é¨ç½®ä¸º 0
integer &= (integer << 16) | 0xffff;
integer &= (integer << 8 ) | 0x00ff;
integer &= (integer << 4 ) | 0x000f;
integer &= (integer << 2 ) | 0x0003;
integer &= (integer << 1 ) | 0x0001;
// 2. ç¶åï¼å¯¹è¯¥æ°ååï¼æ¤æ¶ä½ä½ç 0 ç个æ°å³ä¸ºææ±
return 32 - clon(~integer) |0;
*/
}
å°ä»¥ä¸å½æ°æ¹åæ ASM.JS 模åââç¶åï¼ä½ å°±å¯ä»¥å»è·å«äººç«èäºï¼ASM.JS å°±æ¯ç¨æ¥å¹²è¿ä¸ªçã
var countTrailsMethods = (function (stdlib, foreign, heap) {
"use asm";
var clz = stdlib.Math.clz32;
function ctrz(integer) {
// 计ç®å°¾é 0 个æ°
integer = integer | 0; // ç¡®ä¿æ¯æ´æ°
// 1. å°ç¬¬ä¸ä¸ª 1 ä¹åç髿°ä½å
¨é¨ç½®ä¸º 1
// ASMjs ä¸ä¸å
许^=ã&=ãå |=
integer = integer | (integer << 16);
integer = integer | (integer << 8);
integer = integer | (integer << 4);
integer = integer | (integer << 2);
integer = integer | (integer << 1);
// 2. ç¶åï¼å¯¹è¯¥æ°ååï¼æ¤æ¶ä½ä½ç 1 ç个æ°å³ä¸ºææ±
return (32 - clz(~integer)) | 0;
}
function ctron(integer) {
// 计ç®å°¾é 1 个æ°
integer = integer | 0; // ç¡®ä¿æ¯æ´æ°
return ctrz(~integer) | 0;
}
// èç¼çæ¯ï¼ASM.JS å¿
须使ç¨ç³ç³ç object ç±»åï¼
// unfourtunately, ASM.JS demands slow crummy objects:
return { a: ctrz, b: ctron };
})(window, null, null);
var ctrz = countTrailsMethods.a;
var ctron = countTrailsMethods.b;
è§è æµè§å¨å
¼å®¹æ§ åè§
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4