这个按位运算的技术名称是什么?
What is the technical name for this bitwise operation?
我正在将 Access 数据库中的一些旧的 Visual Basic 逻辑转换为 JavaScript。有些函数可以获取和设置一个值——由于缺少更好的术语——采用 "bitwise" 格式。我不得不拿出一支铅笔和一些纸来对负责的功能进行逆向工程。
我在下面进行的按位运算的技术术语是什么?请记住插槽总数可能更高(例如 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(将布尔值存储为字中的各个位),这是 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
此外,如果您通过低效格式发送数据,例如文本或 JSON 而不是 AJAX,那么您将需要对结果数字进行编码以最大化每个字符中打包的位数。 .. 使用 x.toString(36)
可让您在单个字符 (a-z0-9) 中存储 5 位 (2^5 = 32)。或者如果你使用 String.fromCharCode(x + 32)
你可以再挤出一点 - 如果你看一下 ASCII table 那么你可以使用 32-127 = 95 范围内的所有 printable 字符,这是 6 位 (2^6 = 64) 的足够值,但不是 7 (2^7 = 128)。尝试使用超过 6 位将导致某些组合输出 multi-byte UTF8 字符,这可能不值得编码开销(它们将显示为一个字符,但实际上使用 2-4 个字节)。
我正在将 Access 数据库中的一些旧的 Visual Basic 逻辑转换为 JavaScript。有些函数可以获取和设置一个值——由于缺少更好的术语——采用 "bitwise" 格式。我不得不拿出一支铅笔和一些纸来对负责的功能进行逆向工程。
我在下面进行的按位运算的技术术语是什么?请记住插槽总数可能更高(例如 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(将布尔值存储为字中的各个位),这是 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
此外,如果您通过低效格式发送数据,例如文本或 JSON 而不是 AJAX,那么您将需要对结果数字进行编码以最大化每个字符中打包的位数。 .. 使用 x.toString(36)
可让您在单个字符 (a-z0-9) 中存储 5 位 (2^5 = 32)。或者如果你使用 String.fromCharCode(x + 32)
你可以再挤出一点 - 如果你看一下 ASCII table 那么你可以使用 32-127 = 95 范围内的所有 printable 字符,这是 6 位 (2^6 = 64) 的足够值,但不是 7 (2^7 = 128)。尝试使用超过 6 位将导致某些组合输出 multi-byte UTF8 字符,这可能不值得编码开销(它们将显示为一个字符,但实际上使用 2-4 个字节)。