我正在将 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
最佳答案
我认为这些通常称为 BitFlags(将 bool 值存储为字中的各个位),它是 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)
将允许您在单个字符 (a-z0-9) 中存储 5 位 (2^5 = 32)。或者,如果您使用 String.fromCharCode(x + 32)
,您可以再挤出一点——如果您查看 ASCII 表,那么您可以使用 32-127 = 范围内的所有可打印字符95,这对于 6 位 (2^6 = 64) 来说足够了,但对于 7 位 (2^7 = 128) 是不够的。尝试使用超过 6 位将导致某些组合输出多字节 UTF8 字符,这可能不值得编码开销(它们将显示为一个字符,但实际上使用 2-4 个字节)。
关于javascript - 这个按位运算的技术名称是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52450066/