Раньше я использовал бит-маски в Java (а не Javascript), но это было какое-то время, и это заставляет меня ошибиться.Javascript бит маски
Это машинопись, с которой я хочу работать. Theres 3 роли,
enum Type {
FRUIT = 0x1,
VEGGIE = 0x2,
BOTH = FRUIT | VEGGIE
}
class Thing {
role:number;
constructor(role:Type){
this.role = role;
}
getRole(){
return this.role;
}
is(role:Type) {
return !!(this.role & role);
}
}
var whatever = new Thing(Type.FRUIT);
console.log('fruit', whatever.is(Type.FRUIT));
console.log('veggie', whatever.is(Type.VEGGIE));
console.log('both', whatever.is(Type.BOTH));
// fruit true
// veggie false
// both true
Я концептуально понять, почему «как» возвращается как «истинный», но мой немного математики не велика.
Когда роль либо FRUIT
, либо VEGGIE
, остальные являются ложными. Когда он установлен в BOTH
, все должно быть правдой.
Пробовал несколько комбинаций сдвигов и бит операций, но я не могу получить этот вывод. Если я попробую их разделить, это прекрасно, но я бы хотел использовать комбинации битов для сборки.
Просто введите новый класс 'Type' с' isFruit' и другими флагами. JS не является языком, когда вы должны использовать битмаски и битовую арифметику. – zerkms
@zerkms Почему вы отвлекаете поразрядную арифметику в JavaScript? Я использовал его несколько раз с большим успехом - вам просто нужно знать, что побитовые операции ограничены 32-битными целыми числами в JS. – dave
@dave любая причина предпочитать битовую арифметику поверх только булевых флагов в JS? Какова техническая причина чрезмерного усложнения решения? – zerkms