此按位运算的技术名称是什么?

时间:2018-09-21 19:31:47

标签: javascript vbscript bit-manipulation

我正在将Access数据库中的一些旧的Visual Basic逻辑转换为JavaScript。有些函数会获取和设置一个“按位”格式的值(由于缺少更好的术语)。我必须拿出铅笔和一些纸来对负责的功能在做什么进行反向工程。

我在下面进行的按位操作的技术术语是什么?请记住,插槽可以的总数可以更高(例如,从15个改为6个)。

---All scheduling slots selected, decimal value = 126

Slot    Selected?   Formula
-----   ----------  ----------
1       1           0 + 2^1 = 2
2       1           2 + 2^2 = 6
3       1           6 + 2^3 = 14
4       1           14 + 2^4 = 30
5       1           30 + 2^5 = 62
6       1           62 + 2^6 = 126

 integer value = 126


--Custom scheduling slots selected, decimal value = 82

Slot    Selected?   Formula
-----   ----------  ----------
1       1           0 + 2^1 = 2
2       0
3       0
4       1           2 + 2^4 = 18
5       0
6       1           18 + 2^6 = 82

integer value = 82

1 个答案:

答案 0 :(得分:0)

我认为这些通常称为 BitFlags (将布尔值存储为一个单词中的各个位),这是BitFields的一种特殊情况:针对不同值来处理任意宽度的位。

它很可能具有多个名称,因为它很明显,而且随着人们学习编程(这就是我发现它的方式),它可能一直在独立地重新发现。

与其计算数值,不如使用SHIFT和OR构造位域,并使用SHIFT和AND破坏位域,因为这更直观,直观(且速度更快);数值只是将整个单词解释为整数的副作用。即:

// construct
x = 0;
// set bit 0
x |= true << 0;
// set bit 1
x |= false << 1;
// set bit 2
x |= true << 2;

x // 5

// destruct
x = 3
// get bit 0
!! (x >> 0 & 1); // true
// get bit 1
!! (x >> 1 & 1); // true
// get bit 2
!! (x >> 2 & 1); // false

此外,如果您要通过低效率格式(例如,通过AJAX通过文本或JSON发送数据),那么您将希望对结果数字进行编码,以最大化填充到每个字符中的位...使用x.toString(36)将您将5位(2 ^ 5 = 32)存储在一个字符(a-z0-9)中。或者,如果您使用String.fromCharCode(x + 32),也可以挤出另一位-如果您查看ASCII表,则可以使用32-127 = 95范围内的所有可打印字符,这足以表示6位( 2 ^ 6 = 64),但不是7(2 ^ 7 = 128)。尝试使用6个以上的位将导致某些组合输出多字节的UTF8字符,这可能不值得编码开销(它们将显示为一个字符,但实际上使用2-4个字节)。