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)