掩码匹配中的位操作

时间:2018-09-27 14:16:11

标签: javascript bit-manipulation match bit

这是一个与位操作(掩码)有关的问题,我正在用Javascript编程。我要执行以下操作:

const entityMask1 = new MaskManager();
entityMask1.addElement(0);
entityMask1.addElement(1);
entityMask1.addElement(2);

let SOME_SYSTEM_MASK = 0;
SOME_SYSTEM_MASK |= (1 << 0); // -> 1
SOME_SYSTEM_MASK |= (1 << 1); // -> 3
SOME_SYSTEM_MASK |= (1 << 2); // -> 7
SOME_SYSTEM_MASK |= (1 << 3); // -> 15
SOME_SYSTEM_MASK |= (1 << 4); // -> 31

entityMask1.matcheAll(SOME_SYSTEM_MASK); // -> false
entityMask1.matchesOne(SOME_SYSTEM_MASK); // -> true
entityMask1.matchNoneOrMore(SOME_SYSTEM_MASK); // -> true
entityMask1.matchesNone(SOME_SYSTEM_MASK); // -> false

function MaskManager() {
    this.mask = 0;
}

MaskManager.prototype.addElement = function(element) {
    this.mask |= (1 << element);
}

MaskManager.prototype.delElement = function(element) {
    this.mask ^= (1 << element);
}

MaskManager.prototype.matchAll = function(targetMask) {
    return (this.mask === targetMask);
}

MaskManager.prototype.matchOne = function(targetMask) {
//    return ?;
}

MaskManager.prototype.matchNoneOrMore = function(targetMask) {
//    return ?;
}


MaskManager.prototype.matchNone = function(targetMask) {
//    return ?;
}

在哪里:

  • matchAll-遮罩包含所有元素。
  • matchOne-遮罩至少包含一个元素。
  • matchNoneOrMore-遮罩没有元素或更多元素。
  • matchNone-遮罩没有这些元素

2 个答案:

答案 0 :(得分:0)

我相信您已经成功,到目前为止,没有任何测试出错。我认为我所做的是正确的,但在某些情况下我可能会被愿景蒙上阴影,但我希望不会:

  

const addElementInMask = (element, newElement) => (element |= (1 << newElement));

const maskEqualsTargetMask = (mask, targetMask) => mask === targetMask;

const maskContainsAllElements = (mask, targetMask) => targetMask === (mask & targetMask);

const maskContainsNoneElements = (mask, targetMask) => mask === (mask & ~targetMask);

const maskContainsOneOrMoreElements = (mask, targetMask) => targetMask === (mask | targetMask) && !maskContainsNoneElements(mask, targetMask);

const maskContainsNoneOrMoreElements = (mask, targetMask) => targetMask === true;

const matchResult = (matchName, expression) => console.log(matchName+': '+expression);

const element1 = 1;
const element2 = 2;
const element3 = 3;

let mask = 0;
mask = addElementInMask(mask, element1);
mask = addElementInMask(mask, element2);

let targetMask = 0;
targetMask = addElementInMask(targetMask, element1);
targetMask = addElementInMask(targetMask, element2);
targetMask = addElementInMask(targetMask, element3);

console.log('Expected: false, false, false, true, true');

matchResult('maskEqualsTargetMask', maskEqualsTargetMask(mask, targetMask));

matchResult('maskContainsAllElements', maskContainsAllElements(mask, targetMask));

matchResult('maskContainsNoneElements', maskContainsNoneElements(mask, targetMask));

matchResult('maskContainsOneOrMoreElements', maskContainsOneOrMoreElements(mask, targetMask));

matchResult('maskContainsNoneOrMoreElements', maskContainsNoneOrMoreElements(mask, targetMask));

答案 1 :(得分:0)

MaskManager.prototype.matchOne = function(targetMask) {
    return ((this.mask & targetMask) !== 0);
}

MaskManager.prototype.matchNone = function(targetMask) {
    return ((this.mask ^ targetMask) === 0);
}

MaskManager.prototype.matchNoneOrMore = function(targetMask) {
    return true;
}