JavaScript 检查数字编码需要多少位的函数?
JavaScript function to check how many bits are required to encode a number?
我有以下问题。这是示例 input/output 数据:
- 我: 0, o: 1 (0)
- 我: 1, o: 1 (1)
- 我: 2, o: 2 (10)
- 我: 3, o: 2 (11)
- 我: 4, o: 3 (100)
- 我: 5, o: 3 (101)
- 我: 6, o: 3 (110)
- 我: 7, o: 3 (111)
不过,那只是用最少的位数来编码数字而已。我想要一些稍微不同的东西,我很难理解它。我希望输出是 2 的幂。
- 我: 0, o: 2 (00)
- 我: 1, o: 2 (01)
- 我: 2, o: 2 (10)
- 我: 3, o: 2 (11)
- 我: 4, o: 4 (0100)
- 我: 5, o: 4 (0101)
- 我: 6, o: 4 (0110)
- 我: 7, o: 4 (0111)
- 我: 8, o: 4 (1000)
- ...
- 我.... o: 8
- ...
- 我.... o: 16
- ...
我如何编写一个函数,它接受 JavaScript 中的整数,并且 returns 给我 o
作为那个数字?一个有效地完成它而不是将东西转换为字符串并使用随机 JS 辅助函数的方法:)
如果您打算编写函数,如果输入之间没有相关性,您可能必须使用二元运算符一次一个地迭代 64 位。如果您只想要第二个用例,请检查它是否已经是 2 的幂,反之亦然。检查 2 的幂。
n~(n-1) == 0
P.S 在移动设备中,请注意编辑错误。
如果您喜欢摆弄,可以find the position of the MSB then find the next power of 2(对于低于 2 的两个值是例外情况)。
我们还可以找到一个封闭的形式:
const bits = x => Math.floor(1+Math.log2(x))
const npot = x => Math.pow(2, Math.ceil(Math.log2(x)))
const f = x => x < 2 ? 2 : npot(bits(x))
但是,鉴于范围内的 2 次幂数量较少,仅使用条件阶梯会更容易、更快速:
const f = x => {
if (x < 2**2) return 2;
if (x < 2**4) return 4;
if (x < 2**8) return 8;
if (x < 2**16) return 16;
if (x < 2**32) return 32;
return 64;
}
(使用 bigints 时,使用循环...)
我有以下问题。这是示例 input/output 数据:
- 我: 0, o: 1 (0)
- 我: 1, o: 1 (1)
- 我: 2, o: 2 (10)
- 我: 3, o: 2 (11)
- 我: 4, o: 3 (100)
- 我: 5, o: 3 (101)
- 我: 6, o: 3 (110)
- 我: 7, o: 3 (111)
不过,那只是用最少的位数来编码数字而已。我想要一些稍微不同的东西,我很难理解它。我希望输出是 2 的幂。
- 我: 0, o: 2 (00)
- 我: 1, o: 2 (01)
- 我: 2, o: 2 (10)
- 我: 3, o: 2 (11)
- 我: 4, o: 4 (0100)
- 我: 5, o: 4 (0101)
- 我: 6, o: 4 (0110)
- 我: 7, o: 4 (0111)
- 我: 8, o: 4 (1000)
- ...
- 我.... o: 8
- ...
- 我.... o: 16
- ...
我如何编写一个函数,它接受 JavaScript 中的整数,并且 returns 给我 o
作为那个数字?一个有效地完成它而不是将东西转换为字符串并使用随机 JS 辅助函数的方法:)
如果您打算编写函数,如果输入之间没有相关性,您可能必须使用二元运算符一次一个地迭代 64 位。如果您只想要第二个用例,请检查它是否已经是 2 的幂,反之亦然。检查 2 的幂。 n~(n-1) == 0
P.S 在移动设备中,请注意编辑错误。
如果您喜欢摆弄,可以find the position of the MSB then find the next power of 2(对于低于 2 的两个值是例外情况)。
我们还可以找到一个封闭的形式:
const bits = x => Math.floor(1+Math.log2(x))
const npot = x => Math.pow(2, Math.ceil(Math.log2(x)))
const f = x => x < 2 ? 2 : npot(bits(x))
但是,鉴于范围内的 2 次幂数量较少,仅使用条件阶梯会更容易、更快速:
const f = x => {
if (x < 2**2) return 2;
if (x < 2**4) return 4;
if (x < 2**8) return 8;
if (x < 2**16) return 16;
if (x < 2**32) return 32;
return 64;
}
(使用 bigints 时,使用循环...)