【问题标题】:How can I check that a bit is set (without bitwise operation)?如何检查是否设置了位(没有按位运算)?
【发布时间】:2015-09-23 07:57:38
【问题描述】:

查看 int 44 — 我需要二进制位置的 Math.CEIL (log(2) 44) 来表示 44。 (答案是 6 个位置)

6 个地方:

___  ___  ___  ___  ___   ___
32   16    8    4    2     1

但是我如何检查(例如)8 的位是否被检查?

一个简单的解决方案是:

((1<<3) & 44)>0 所以这将检查该位是否已设置。

但请注意,计算机在幕后将44 转换为其二进制表示,并通过按位运算检查是否设置了位。

另一种解决方案是自己通过toString(2)mod%2 在循环中构建二进制文件

问题

数学上通过哪个公式,我可以测试是否设置了n'th 位?

(我更喜欢非循环操作,但更喜欢纯单一的数学短语)

【问题讨论】:

  • 数学上,没有勺子——嗯,我是说比特。
  • @RoyiNamir,但是按位运算有什么问题?为什么要避免它?
  • :) 但仍然——“计算机将 44 转换为其二进制表示,并检查是否通过按位运算设置了位”,不,这是混合隐喻(或者可能只是技术)。 “第 n 位”按位运算。这与检查大十进制数(以及任何其他基数)中的“第 n 个小数”的值相同。我很确定你会在某个地方需要像 mod 和 div 这样的东西。
  • 任何提示为什么你不想要二进制操作?这是对位进行操作的最有效方式(比toString% 更有效)。或者,您可以使用log,您显然知道。
  • @Amadan 我正在构建一个类似生成器的 tinyURL,所以我有 abc..ABC...0..9 这是 26+26+10 这是 62 个选项,所以它的基数是 62。现在,在我有要编码的数字之后( 44) 我有名额。但现在遍历每个地方我需要知道是否有 vlue 以及价值是什么

标签: javascript math bit-manipulation


【解决方案1】:

您可以简单地检查该位置的bit是否设置为1

function isBitSet(no, index) {
    var bin = no.toString(2);
    // Convert to Binary

    index = bin.length - index;
    // Reverse the index, start from right to left

    return bin[index] == 1;
}
isBitSet(44, 2); // Check if second bit is set from left

DEMO

【讨论】:

    【解决方案2】:

    索引号index中的'bit'(实际上是任何基数)值在基数baseval中/em> 通常可以计算为

    val = 1966;
    index = 2;
    base = 10;
    alert (Math.floor(val/Math.pow(base,index)) % base);
    

    结果:9

    val = 44;
    index = 3;
    base = 2;
    alert (Math.floor(val/Math.pow(base,index)) % base);
    

    结果:1(此处只有 01 可用 - 范围将始终为 0..base-1)。

    Math.floor(在 Javascript 中强制转换为整数)和Math.pow 的组合在这里有点不确定。即使在整数范围内,Math.pow 也可能会生成一个浮点数低于预期的“整数”数。也许总是添加一个小常数更安全:

    alert (Math.floor(0.1+val/Math.pow(base,index)) % base);
    

    【讨论】:

    【解决方案3】:

    除以您要检查的位的值 并测试是否设置了第一位(可以用x mod 2 == 1测试)

    数学表达式:

    floor(value/(2^bitPos)) mod 2 = 1
    

    作为JS函数:

    function isSet(value, bitPos) {
       var result =   Math.floor(value / Math.pow(2, bitPos)) % 2;
       return result == 1;
    }
    

    注意:bitPos 以 0 开头(代表 nr 1 的位)

    【讨论】:

    • 测试第三位 Math.floor((44)/(2^2)) % 2 NaN
    • @RoyiNamir,对于权力,使用Math.pow,如果我没记错的话2^22 xor 2
    • 测试用例 44 返回:isSet(44,5) == true; isSet(44,4) == 假; isSet(44,3) == 真; isSet(44,2) == 真; isSet(44,1) == 假; isSet(44,0) == false;
    猜你喜欢
    • 2021-12-20
    • 2017-03-22
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    相关资源
    最近更新 更多