js位操作需要注意的问题

举报
Amrf 发表于 2020/03/06 10:27:32 2020/03/06
【摘要】 js位操作针对的是32位有符号整数1<<31的结果是-2147483648可以通过(1<<31)>>>0转回无符号;同理,其他位操作的时候也有出现溢出为负数的情况,也需要进行类似的处理;参考:https://www.jianshu.com/p/2cb75bfa34b0https://developer.mozilla.org/en-US/docs/Web/JavaScript/Referen...

js位操作针对的是32位有符号整数

1<<31的结果是-2147483648

可以通过(1<<31)>>>0转回无符号;

同理,其他位操作的时候也有出现溢出为负数的情况,也需要进行类似的处理;

参考:

https://www.jianshu.com/p/2cb75bfa34b0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators

分享一个通过字符串函数间接位操作的函数:

Vue.prototype.calcBits = function (newVal, oldVal32, begin, end) {
  if (typeof begin === 'string') {
    begin = parseInt(begin)
  }
  if (typeof end === 'string') {
    end = parseInt(end)
  }
  if (end >= 32 || begin < 0 || begin > end) {
    console.error(`setBits(${newVal},${oldVal32},${begin},${end})`)
    return;
  }
  let oldVal32s = oldVal32.toString(2).padStart(32, '0').split("");
  let bitlen = end - begin + 1;
  let newVals = newVal.toString(2).padStart(bitlen, '0').substr(-bitlen).split("");
  for (var i = 0; i < bitlen; ++i) {
    oldVal32s[31 - (i + begin)] = newVals[(bitlen - 1 - i)];
  }
  return parseInt(oldVal32s.join(""), 2)
}

Vue.prototype.queryBits = function (val32, begin, end) {
  if (typeof begin === 'string') {
    begin = parseInt(begin)
  }
  if (typeof end === 'string') {
    end = parseInt(end)
  }
  if (end >= 32 || begin < 0 || begin > end) {
    console.error(`setBits(${val32},${begin},${end})`)
    return;
  }
  let bitlen = end - begin + 1;
  let val = val32.toString(2).padStart(32, '0').substr(-end - 1, bitlen);
  return parseInt(val, 2)
}
Vue.prototype.gWriteBit = function (regVec, self, rid, index, value) {
  if (isNaN(index) || index < 0 || index > 32) {
    return;
  }
  let mask = (1 << index) >>> 0;
  return new Promise(function (resolve) {
      setTimeout(
        function () {
          var reg = regVec[rid];
          var val = 0;
          if (isNaN(value)) {
            val = regVec[rid].RegValue ^ mask;
          } else {
            if (value) {
              val = regVec[rid].RegValue | mask;
            } else {
              val = regVec[rid].RegValue & ~mask;
            }
          }
          ...
          self.$forceUpdate();
          resolve;
        }.bind(self),
        300
      );
  }.bind(self));
}




【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。