如何使用位掩码在JavaScript中存储布尔值

如何使用位掩码在JavaScript中存储布尔值,javascript,bitmask,Javascript,Bitmask,读了关于如何使用位掩码存储布尔值的内容后,我有点困惑。我希望有一组布尔值,然后为每个值的组合生成一个唯一的整数。以下是目前的系统: var a = 1 << 1 var b = 1 << 2 var c = 1 << 3 var d = 1 << 4 var uniqueint1 = getInt(true, false, false) var uniqueint2 = getInt(true, true, false) var uniquein

读了关于如何使用位掩码存储布尔值的内容后,我有点困惑。我希望有一组布尔值,然后为每个值的组合生成一个唯一的整数。以下是目前的系统:

var a = 1 << 1
var b = 1 << 2
var c = 1 << 3
var d = 1 << 4

var uniqueint1 = getInt(true, false, false)
var uniqueint2 = getInt(true, true, false)
var uniqueint3 = getInt(true, true, true)
// ...

function getInt(x, y, z) {
  var value = a
  if (x) value = value | b
  if (y) value = value | c
  if (z) value = value | d
  return value
}
我所知道的是,我已经看到了与位掩码相关的
|
&
^
,我知道在您所做的位掩码中是否存在布尔值
var yes=value&b
,但我只是不知道如何生成位掩码,以便它同时处理if(true)和if(false)情况。不确定我是否应该在某个地方使用
^
,或者我做错了什么。请告知。谢谢大家!

NOT op将反转该位,因此需要对其进行设置才能清除

(假设您想在现有值上打开或关闭位:)您可以将NOT与AND掩码一起使用来清除如下位:

var v=0xff;//价值

var bit3=1通过在开始时执行
var value=1
,您已经将值设置为2,因为
1
我不确定我是否应该处理这个“不”的案子

你根本不应该处理它。位掩码的工作原理是,如果设置了标志,则具有值为
1
的位;如果未设置标志,则具有值为
0
的位。假设您的值处处以
0
s(整数0)开头,那么当您的条件为真时,您只需设置位(by或1),而不必执行任何其他操作

您可以将代码简化为

function getInt(x, y, z) {
  return (0b10 // a
          | (x << 2)   // 0b00100 if x and 0b00000 else
          | (y << 3)   // 0b01000 if y and 0b00000 else
          | (z << 4)); // 0b10000 if z and 0b00000 else
}
函数getInt(x,y,z){ 返回(0b10//a
|(x)你能更具体地解释一下“not”的意思吗?这不就是“yes”的否定形式吗?我还想知道是什么促使你在这里使用按位异或运算符。不要使用
0xFF^bit3
来反转。只需使用
~bit3
-这会反转所有(在JS32中)比特,不仅仅是8个。@Bergi我忘了那一个..谢谢(或者我想到的是C..hmm)。0xff是我太懒了:)
var a = 1 << 1
var b = 1 << 2
var c = 1 << 3
var d = 1 << 4

function getInt(x, y, z) {
  var value = 0
  if (x) value = value | b
  if (y) value = value | c
  if (z) value = value | d
  return value
}

var uniqueint1 = getInt(true, false, false)
var uniqueint2 = getInt(true, true, false)
var uniqueint3 = getInt(true, true, true)
uniqueint1
function getInt(x, y, z) {
  return (0b10 // a
          | (x << 2)   // 0b00100 if x and 0b00000 else
          | (y << 3)   // 0b01000 if y and 0b00000 else
          | (z << 4)); // 0b10000 if z and 0b00000 else
}