3

首先对不起我的英语。假设我有,

0 // 0
1 // 1
2 // 10
3 // 11
4 // 100
5 // 101
6 // 110
7......................

现在,我可以说 5 有两个(第 3 和第 1)ON 标志。类似地,7 具有三个(第 1、第 2 和第 3)ON 标志,依此类推。

现在,假设我有一个输入 2 和 flag1、flag2、...... flagn。我需要以编程方式找到只有 flag2 为 ON。

4

4 回答 4

5

你不能,因为你已经可以在二进制表示中看到。A 3 可以是 3 或 2+1。所以使用二的幂:

0 // 0000
1 // 0001
2 // 0010
4 // 0100
8 // 1000

然后在检查 的值时5 (0101),您会看到 1 和 4 的位已设置,因此您知道启用了哪些标志。

我不知道确切的 JavaScript 语法,但可以这样做:

FLAG_1 = 1
FLAG_2 = 2
FLAG_3 = 4
FLAG_4 = 8
FLAG_5 = 16

var foo = FLAG_2 | FLAG_5; // Use binary OR (|) to add flags

if (foo & FLAG_5)
{
    // Do something that has to be done when FLAG_5 is set
}
于 2012-05-04T11:29:06.507 回答
3

这可以通过JavaScript 位运算符&特别是运算符来完成。如果输入数字是,2那么您可以检查设置了哪些标志,如下所示:

console.log(2 & 1); // 1 = 00000001b, result = 0
console.log(2 & 2); // 2 = 00000010b, result = 2, bingo!
console.log(2 & 4); // 4 = 00000100b, result = 0
console.log(2 & 8); // 8 = 00001000b, result = 0

该运算符的行为描述如下:

按位与

在两个操作数的对应位都是 1 的每个位位置返回一个 1。

编辑

上面的例子可以写成这样的循环:

var input = 7;
for(var bit = 0; bit < 8; bit++) {
    var mask = Math.pow(2, bit);
    console.log("bit #" + bit + " is", (input & mask) == mask ? "set" : "clear");
}
于 2012-05-04T11:34:11.183 回答
1

您可以使用带有标志位置的 & 运算符检查标志是否打开(0-indexed)

if (num & (1 << flagPosition)) { /*flag is on */}
else { /*flag is off */} 

您可以检查是否只有一个标志在使用 & 与这种形式的数字 2^N - 1 (其中 N 是最大标志数 + 1)

var N = (1 << 31) - 1;
if (N & num == 1 << flagPosition)  {/* only flagPosition is ON*/}
else { /*flagPosition is OFF or there are other ON flags*/}
于 2012-05-04T11:34:30.503 回答
0
num = 6
arr = new Array();
while(num!=0){
   arr.push(num%2);
   num = parseInt(num/2);
}
console.log(arr)

Arr 将具有位 1 和 0,您可以从中找到 ON

于 2012-05-04T11:35:30.020 回答