八进制数的按位运算
Bitwise operation on octal number
我想在 javascript 中对一个变量做一些位操作。我有这个数字:
分钟:153391689(基数 10)- 1111111111(基数 8)
最大值:1073741823(基数 10)- 7777777777(基数 8)
现在我想使用这个变量来存储 10 "vars",选项从 0 到 7。
为此,我需要获取并设置每个八进制数字(即 3 位)。
不幸的是,我没有成功,但我带来了一些东西:
var num = 153391689;
function set(val, loc) {
num |= val << (loc * 3);
}
function get(loc) {
return (num & 7 << loc * 3) / Math.pow(8, loc);
}
谢谢。
正如 Amit 在评论中提到的,您的设置函数在设置值之前不会清除这些位,因此如果该位置已经有一个值,那么新值将与它进行或运算。
您可以通过将数字与该位置的位掩码的按位 NOT 进行 AND 运算来清除该位置。将按位 NOT 应用于掩码意味着只有在您感兴趣的位置 not 的位保持设置。
function set(val, loc) {
num &= ~(7 << (loc * 3)); // clear bits
num |= val << (loc * 3); // set bits
}
请注意,(loc * 3)
周围的括号是可选的,因为 Javascript 的 order of operator precedence 意味着即使没有它们,乘法也会在移位之前完成。
您的 get
函数看起来可以正常工作,但您可以对其进行简化。不是将位掩码左移,AND 运算然后再次右移(通过除法),您可以只右移然后掩码。这会将您感兴趣的位移动到最低有效的 3 位,然后用 AND:
屏蔽它们
function get(loc) {
return (num >> (loc * 3)) & 7;
}
我想在 javascript 中对一个变量做一些位操作。我有这个数字:
分钟:153391689(基数 10)- 1111111111(基数 8) 最大值:1073741823(基数 10)- 7777777777(基数 8)
现在我想使用这个变量来存储 10 "vars",选项从 0 到 7。 为此,我需要获取并设置每个八进制数字(即 3 位)。 不幸的是,我没有成功,但我带来了一些东西:
var num = 153391689;
function set(val, loc) {
num |= val << (loc * 3);
}
function get(loc) {
return (num & 7 << loc * 3) / Math.pow(8, loc);
}
谢谢。
正如 Amit 在评论中提到的,您的设置函数在设置值之前不会清除这些位,因此如果该位置已经有一个值,那么新值将与它进行或运算。
您可以通过将数字与该位置的位掩码的按位 NOT 进行 AND 运算来清除该位置。将按位 NOT 应用于掩码意味着只有在您感兴趣的位置 not 的位保持设置。
function set(val, loc) {
num &= ~(7 << (loc * 3)); // clear bits
num |= val << (loc * 3); // set bits
}
请注意,(loc * 3)
周围的括号是可选的,因为 Javascript 的 order of operator precedence 意味着即使没有它们,乘法也会在移位之前完成。
您的 get
函数看起来可以正常工作,但您可以对其进行简化。不是将位掩码左移,AND 运算然后再次右移(通过除法),您可以只右移然后掩码。这会将您感兴趣的位移动到最低有效的 3 位,然后用 AND:
function get(loc) {
return (num >> (loc * 3)) & 7;
}