1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
|
---
title: Math.clz32()
slug: Web/JavaScript/Reference/Global_Objects/Math/clz32
tags:
- JavaScript
- Math
- sintaxe Math.clz32()
translation_of: Web/JavaScript/Reference/Global_Objects/Math/clz32
---
<div>{{JSRef}}</div>
<p>A função Math.clz32 () retorna o número de zero bit inicial na representação binária de 32 bits de um número.</p>
<div>{{EmbedInteractiveExample("pages/js/math-clz32.html")}}</div>
<p class="hidden">A fonte para esse exemplo interativo está armazenado em um GitHub repositório. Se você desejar contribuir com o projeto de exemplos interativos, por favor clone <a href="https://github.com/mdn/interactive-examples">https://github.com/mdn/interactive-examples</a> e nos enie um pull request.</p>
<h2 id="Sintaxe">Sintaxe</h2>
<pre class="syntaxbox notranslate"><code>Math.clz32(<var>x</var>)</code></pre>
<h3 id="Parâmetros">Parâmetros</h3>
<dl>
<dt><var>x</var></dt>
<dd>Um número.</dd>
</dl>
<h3 id="Valor_de_retorno">Valor de retorno</h3>
<p>O número de zero bits à esquerda na representação binária de 32 bits do número fornecido.</p>
<h2 id="Descrição">Descrição</h2>
<p>"<code>clz32</code>" é short para<code>CountLeadingZeroes32</code>.</p>
<p>Se x não for um número, ele será convertido em um número primeiro e depois convertido em um número inteiro não assinado de 32 bits.</p>
<p>Se o número inteiro não assinado de 32 bits convertido for 0, retorne 32, porque todos os bits são 0.</p>
<p>Essa função é particularmente útil para sistemas que são compilados para JS, como o Emscripten.</p>
<h2 id="Exemplos">Exemplos</h2>
<h3 id="Usando_Math.clz32">Usando <code>Math.clz32()</code></h3>
<pre class="brush: js notranslate">Math.clz32(1); // 31
Math.clz32(1000); // 22
Math.clz32(); // 32
var stuff = [NaN, Infinity, -Infinity, 0, -0, null, undefined, 'foo', {}, []];
stuff.every(n => Math.clz32(n) == 32); // true
Math.clz32(true); // 31
Math.clz32(3.5); // 30</pre>
<h2 id="Contagem_dos_principais_e_mais_além">Contagem dos principais e mais além</h2>
<p>No momento, não há Math.clon para "Count Leading Ones" (chamado "clon", não "clo", porque "clo" e "clz" são muito semelhantes, especialmente para pessoas que não falam inglês). No entanto, uma função clon pode ser criada facilmente, invertendo os bits de um número e passando o resultado para Math.clz32. Fazer isso funcionará porque o inverso de 1 é 0 e vice-versa. Assim, a inversão dos bits inverterá a quantidade medida de 0s (de Math.clz32), fazendo com que Math.clz32 conte o número de unidades em vez de contar o número de zeros.</p>
<p>Considere a seguinte palavra de 32 bits:</p>
<pre class="brush: js notranslate">var a = 32776; // 00000000000000001000000000001000 (16 zeros à esquerda)
Math.clz32(a); // 16
var b = ~32776; // 11111111111111110111111111110111 (32776 inverso, 0 zeros à esquerda)
Math.clz32(b); // 0 (isso é igual a quantos líderes existem em um)</pre>
<p>Usando essa lógica, uma função clon pode ser criada da seguinte maneira:</p>
<pre class="brush: js notranslate">var clz = Math.clz32;
function clon(integer){
return clz(~integer);
}
</pre>
<p>Além disso, essa técnica pode ser estendida para criar funções inumeráveis "Contagem de zeros à direita" e funções de contagem de zeros, como mostrado abaixo. A função ctrz abaixo preenche todos os bits altos com o bit mais baixo preenchido e depois os anula para apagar todos os bits mais altos definidos, de modo que o clz possa ser usado.</p>
<pre class="brush: js notranslate">var clz = Math.clz32;
function ctrz(integer){ // contar zeros à direita
// 1. preencha todos os bits mais altos após o primeiro
integer |= integer << 16;
integer |= integer << 8;
integer |= integer << 4;
integer |= integer << 2;
integer |= integer << 1;
// 2. Agora, a inversão dos bits revela os bits mais baixos
return 32 - clz(~integer) |0; // `|0`garante coerção inteira
}
function ctron(integer){ // conta os que estão à direita
// Nenhum operador shift-fill-in-with-ones está disponível em
// JavaScript, portanto, o código abaixo é o mais rápido
return ctrz(~integer);
/ * Implementação alternativa para fins demonstrativos:
// 1. apaga todos os bits mais altos após o primeiro zero
integer &= (integer << 16) | 0xffff;
integer &= (integer << 8 ) | 0x00ff;
integer &= (integer << 4 ) | 0x000f;
integer &= (integer << 2 ) | 0x0003;
integer &= (integer << 1 ) | 0x0001;
// 2. Agora, reverter os bits revela os zeros mais baixos
return 32 - clon(~integer) |0;
*/
}
</pre>
<p>Transforme essas funções auxiliares no módulo ASM.JS; então, você tem uma verdadeira obra-prima de desempenho. Situações como essas são exatamente para o que o ASM.JS foi projetado.</p>
<pre class="brush: js notranslate">var countTrailsMethods = (function(stdlib, foreign, heap) {
"use asm";
var clz = stdlib.Math.clz32;
function ctrz(integer) { // count trailing zeros
integer = integer | 0; // coerce to an integer
// 1. preencha todos os bits mais altos após o primeiro
// ASM js, por algum motivo, não permite ^ =, & = ou | =
integer = integer | (integer << 16);
integer = integer | (integer << 8);
integer = integer | (integer << 4);
integer = integer | (integer << 2);
integer = integer | (integer << 1);
// 2. Agora, a inversão dos bits revela os bits mais baixos
return 32 - clz(~integer) |0;
}
function ctron(integer) { //contar os últimos
integer = integer | 0; // coagir a um número inteiro
return ctrz(~integer) |0;
}
// infelizmente, o ASM.JS exige objetos compactos lentos:
return {a: ctrz, b: ctron};
})(window, null, null);
var ctrz = countTrailsMethods.a;
var ctron = countTrailsMethods.b;</pre>
<h2 id="Polyfill-Trecho_de_código">Polyfill-"Trecho de código"</h2>
<p>O seguinte polyfill é o mais eficiente.</p>
<pre class="brush: js notranslate">if (!Math.clz32) Math.clz32 = (function(log, LN2){
return function(x) {
// Seja n ToUint32 (x).
// Seja p o número de zero bits iniciais em
// a representação binária de 32 bits de n.
// Retornar p.
var asUint = x >>> 0;
if (asUint === 0) {
return 32;
}
return 31 - (log(asUint) / LN2 | 0) |0; // the "| 0" acts like math.floor
};
})(Math.log, Math.LN2);
</pre>
<h2 id="Especificações">Especificações</h2>
<table class="standard-table">
<thead>
<tr>
<th scope="col">Especificação</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{SpecName('ESDraft', '#sec-math.clz32', 'Math.clz32')}}</td>
</tr>
</tbody>
</table>
<h2 id="Compatibilidade_do_navegador">Compatibilidade do navegador</h2>
<div class="hidden">A tabela de compatibilidade nesta página é gerada a partir de dados estruturados. Se você deseja contribuir com os dados, consulte https://github.com/mdn/browser-compat-data e envie-nos uma solicitação de recebimento.</div>
<p>{{Compat("javascript.builtins.Math.clz32")}}</p>
<h2 id="Veja_também">Veja também</h2>
<ul>
<li>{{jsxref("Math")}}</li>
<li>{{jsxref("Math.imul")}}</li>
</ul>
|