javascript - KeysPressed 是位掩码的。如何取消位掩码并将其放入关键状态的结构中? (Javascript)

标签 javascript math

因此,我将按钮输入从交换机发送到我的 node.js TCP 服务器。 它是一个数字,但当按下多个按钮时,它们会加在一起。 操纵杆位置不属于该数据集。 如何将 KeysPressed 更改回按键状态结构? 最好是在 javascript 中,因为我使用的是 node.js

这是一个例子来说明我的意思 按钮编号如下。我确实明显注意到了这种模式,但我不确定如何将其转换为 JavaScript 中的多个按键。

A = 1
B = 2
X = 4
Y = 8
LanalogPress = 16
RanalogPress = 32
L = 64
R = 128
ZL = 256
ZR = 512
+ = 1024
- = 2048
DpadL = 4096
DpadU = 8192
DpadRight = 16384
DpadDown = 32768

现在,如果我按下 A 和 X,则 KeysPressed = 5。因为 1 + 4 当然是 5。

如果是 + 和 x,则 KeysPressed = 1028。依此类推。

我从未遇到过此类问题,并且很想了解为什么会这样做以及该问题的解决方案是什么。谷歌搜索肯定不是一件容易的事情,哈哈

最佳答案

看起来你有一个位掩码,其中 1 表示“打开”,0 表示“关闭”。二进制数 5 为 101,因此从右向左读取表示第一个值 (A) 为“on”,第二个值 (B) 为“off”,第三个值 (X) 为“on”。

类似地,9 是 1001,因此 A 打开,B 关闭,X 关闭,Y 打开。

按位右移运算符会丢弃数字最右边的位并将所有内容向右移动,因此 5 >> 1 仅移动一位,因此 101 变为 10 或 2。您可以循环遍历数字,每次移动一位并测试奇数/偶数,看看最后一位数字是 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));
<input id="inp0"> Enter number<br>
<button id="btn0">getState</button><br>
<div>Mask:&nbsp;<span id="mask"></span></div>
<pre id="state"></pre>

我几乎复制了你的方法,但你也可以做一些事情,比如只获取“on”按钮:

// 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);

我确信有很多更时髦的方法来实现它,但是你必须保持它的可维护性,这取决于你想要的结果,这样你就可以将它用于其他任何事情。

关于javascript - KeysPressed 是位掩码的。如何取消位掩码并将其放入关键状态的结构中? (Javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61202235/

相关文章:

php - Web REPL环境

php - mysql 查找数字的第n位

javascript - 将 div 设置为UpperCase()

javascript - 动画期间的 jQuery 碰撞检测

javascript - 类型错误 : Cannot read property 'theme' of undefined in React

javascript - jQuery 表单元素未动态加载

javascript - 大数 - JavaScript 中的数学

javascript - math - 在 Javascript 中获取旋转后的图像尺寸

JavaScript 缩放指数

python - 在 Python 矩阵中,考虑到选择列的成本,如何选择每行一次并获得最低总和?