js位操作需要注意的问题
【摘要】 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)