位掩码问题

时间:2011-06-07 19:36:56

标签: bitmask bit-masks

读取销售点系统的文档,以下是他们为掩码提供的示例,该掩码应该告诉您选择了哪些座位。我无法弄清楚这一点。我完全理解位屏蔽。这个例子是错的吗?

功能

此系统变量是一个包含座位过滤器掩码的八个字符的字符串。

类型/大小

A8

语法

@Filter_mask

Filter_mask用法

此系统变量为只读。

Filter_mask示例

以下是过滤器掩码的示例:

80000000 - seat 1 is active (@filter_active ="Y")
00000001 - seat 32 is active (@filter_active = "Y")
50A00000 - seats 2,4,9 and 11 are active (@filter_active = "Y")
00000000 - filter inactive, no seats

4 个答案:

答案 0 :(得分:2)

将每个数字一次转换为4位二进制数。

80000000 -> 1000 0000 ....
50A00000 -> 0101 0000 1010 ...

答案 1 :(得分:2)

这些是8位十六进制数字,可以存储多达32位的二进制数。

(16 ^ 8 = 2 ^ 32 = 4,294,967,296)

在二进制表示中,每个数字对应一个座位:

   hex               binary
80000000 = 10000000000000000000000000000000
00000001 = 00000000000000000000000000000001
50a00000 = 01010000101000000000000000000000
00000000 = 00000000000000000000000000000000

第一个二进制位用于座位#1,最后一个用于座位#32。由于它们为您提供了8个字符的字符串,因此您可能希望将其解析为32位值来执行屏蔽算法。在目标语言中查找“十六进制字符串到整数”,您将找到类似的内容:

Convert hex string to int in Python

注意:当您查看此类内容时,Google可以为您完成基本转换,例如("0x50a00000 in binary"),但Wolfram Alpha会做更多的事情:

http://www.wolframalpha.com/examples/NumberBases.html

答案 2 :(得分:1)

这个例子似乎是正确的。它们只是颠倒了最重要和最低有效位,并使用了基于1的索引作为位位置(除了将数据保存在ASCII而不是4字节的十六进制中)。因此,如果设置了位n(LSB为位#0或值00000001),则会得到座位号31-n+1

答案 3 :(得分:1)

您的面具如下:

Seat 1: 0x80000000
Seat 2: 0x40000000
Seat 3: 0x20000000
Seat 4: 0x10000000
Seat 5: 0x08000000
...
Seat 31:0x00000002
Seat 32:0x00000001

或者更一般:

mask = 1 << (32 - seatno)

示例:

0x50A00000 = 0x40000000 | 0x10000000 | 0x00800000 | 0x00200000
因此,座位2,4,9和11。