Похоже, у вас есть битовая маска, где 1 "включены", а 0 "выключены". Число 5 в двоичном виде - 101, поэтому при чтении справа налево это означает, что первое значение (A) включено, второе значение (B) выключено, а третье значение (X) включено.
Аналогично 9 равно 1001, так что A включено, B выключено, X выключено и Y включено.
Оператор побитового сдвига вправо отбрасывает самый правый бит числа и сдвигает все вправо, поэтому 5 >> 1
сдвигается только один бит, поэтому 101
становится 10
или 2. Вы можете l oop по числу, сдвигая его по одному биту за раз и проверяя на нечетность / четность, чтобы определить, равен ли последний ди git 1 (нечетно) ) или 0 (даже), пока у вас не закончатся биты, или не запустите свойства и включите или выключите их, как вы сделали.
Например,
// Decode number n to state
function decodeMask(n) {
let props = ['A','B', 'X', 'Y', 'LanalogPress', 'RanalogPress', 'L', 'R', 'ZL', 'ZR', '+', '-', 'DpadL', 'DpadU', 'DpadRight', 'DpadDown'];
// Use empty object so no key clash. Note, doesn't have toString method!
let state = Object.create(null);
props.forEach((key, i) => state[key] = !!((n>>i) % 2));
return state;
}
// Stuff to play with decodeMask
function handleClick(evt) {
let inp = document.getElementById('inp0');
let res = document.getElementById('mask');
let state = document.getElementById('state');
let n = Number(inp.value);
let s = decodeMask(n);
res.textContent = n.toString(2).padStart(Object.keys(s).length,'0');
state.textContent = Object.keys(s).reduce((acc, key) => {
acc.push(key + ': ' + s[key]);
return acc;
},[]).join('\n');
}
window.onload = function() {
document.getElementById('btn0').addEventListener('click', handleClick, false);
}
// console.log(decodeMask(5));
Enter number
Mask:
Я в значительной степени скопировал ваш метод, но вы также можете делать такие вещи, как просто нажимать кнопки включения:
// Return state object
let n = 9; // 1001
let props = ['A', 'B', 'X', 'Y']; // and so on
for (var state = {}, i = 0; n; i++) {
if (n % 2) state[props[i]] = 'on';
n = n >> 1;
}
console.log(state);
// Return just the "on" props
let v = 9; // 1001
let s = props.filter((prop, i) => (v >> i) % 2);
console.log(s);
Я уверен, что есть гораздо более забавные способы сделать это, но вы должны поддерживать его в обслуживании, и это зависит от того, что вы хотите, чтобы результат был таким Вы можете использовать его для чего-либо еще.