这个位运算的技术名称是什么?

3
我正在将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

2
这只是将二进制数转换为十进制数。除了你似乎缺少一个0位。二进制1111110=1261010010=82 - Matt Burland
1
你可以使用js实现这个功能,代码如下:parseInt('111111', 2) << 1 // 126 parseInt('101001', 2) << 1 // 82 - Mark
@MarkMeyer 我理解的正确吗?“将整数转换为二进制,然后执行'零填充左移',因为您忘记了第一个零,并且我不关心右侧连续的0”? - NamedArray
1
@raydlevel5 是的,它是“将此字符串解析为基数为2的整数”。然后使用<< 1将其向右移动一位,以补充缺失的零,以获得预期的结果。 - Mark
它们被称为标志。Msgbox 5 and &h1 返回1,表示位0已设置(2^0 = 1)。Msgbox 6 and &h1 返回0,表示位0未设置。因此,可以测试1、2、4、8、16、32、...、n。 - CatCat
1个回答

1
我认为这些通常被称为位标志(将布尔值作为单独的位存储在一个字中),它是位域的一种特殊情况:用于解决不同值的任意位宽度问题。
很可能它有多个名称,因为它非常显然,可能会被人们独立地重新发现,当他们学习编程时(这就是我发现它的方式)。
与计算数值相比,更常见的是使用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表,你会发现在32-127=95的可打印字符范围内可以使用所有可打印字符,足够表示6位(2^6=64),但不足7位(2^7=128)。尝试使用超过6位将导致某些组合输出多字节UTF8字符,这可能不值得编码开销(它们将显示为一个字符,但实际上使用2-4个字节)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接