八进制数的按位运算

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;
 }