我正在将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
答案 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个字节)。