値が(列挙型またはオブジェクト型の)フラグのセットに対応するかどうかを確認したいと思います。値が列挙型の複数の特定のフラグと一致するかどうかを検証する(ビット単位で)
今、私は(スニペットを賞賛:3):JavaScriptで以下の機能が出ている
function hasFlags(flags, value) {
let s = flags.reduce((sum, v) => sum += v, 0);
return (s & value) === s
}
FLAGS = {
STEP_0: 1 << 0,
STEP_1: 1 << 1,
STEP_2: 1 << 2,
STEP_3: 1 << 3,
STEP_4: 1 << 4,
STEP_5: 1 << 5,
STEP_6: 1 << 6,
STEP_7: 1 << 7
}
const needed = [
FLAGS.STEP_2,
FLAGS.STEP_3,
FLAGS.STEP_6,
]
console.log(hasFlags(needed, 4)); // false
console.log(hasFlags(needed, 8)); // false
console.log(hasFlags(needed, 64)); // false
console.log(hasFlags(needed, 4 + 8)); // false
console.log(hasFlags(needed, 4 + 64)); // false
console.log(hasFlags(needed, 8 + 64)); // false
console.log(hasFlags(needed, 4 + 8 + 64)); // true
console.log(hasFlags(needed, 4 + 8 + 64 + 1)); // true
console.log(hasFlags(needed, 4 + 8 + 64 + 2)); // true
console.log(hasFlags(needed, 4 + 8 + 64 + 1 + 2)); // true
// etc...
Pythonでは関数は次のようになります。
def hasFlags(flags, value):
s = sum(flags)
return (s & value) == s
print hasFlags((4,8,64), 4) # False
print hasFlags((4,8,64), 4+8+64) # True
# ...
この同じ検証を行うには、より良い方法がありますか(つまり、よりイディオム的であるか、より多くのpythonic)ですか?
編集:Pythonとjavascriptの両方のソリューションは高く評価されていますが、特に私はウェブ上で多くの検索をしていて、決して見つからなかったアルゴリズムを探しています。それは共通の問題です。
さらに多くのpythonicを意味しますか?これは私にとっては大丈夫です。たぶん私は間違っています。 – scharette