位掩码问题

问题描述:

Readng销售点系统的文档,这里是他们给出的掩码的示例,该掩码应该告诉您选择了哪些座位。我无法弄清楚这一点。我完全理解位掩码。这个例子错了吗?位掩码问题

功能

此系统变量是包含座滤波器掩模的八个字符的字符串。

类型/大小

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 
+1

的例子看起来是正确的,对我一贯的 - 它是什么,您有确切困难吗? MSB是座位1,LSB是座位32. – 2011-06-07 19:39:58

+0

或者我不明白位掩码。你能解释80000000如何转换为座位1吗? – Bob 2011-06-07 19:43:44

+0

每次将每个数字转换为4位二进制。 – 2011-06-07 19:45:09

这些是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

注:谷歌可以做基础的转换即兴你,当你正在寻找的东西像这一点,如("0x50a00000 in binary"),但Wolfram Alpha的确实有点多:

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

示例似乎是正确的。他们只是反转了最重要的和最不重要的位,并且使用了一个基于1的位索引(除了将数据保存为ASCII而不是4字节的十六进制数据外)。所以,如果位n被设置(LSB是位#0,或值00000001),您可以获得座位号码31-n+1

+0

我还没有看到'80000000'是'1' – trutheality 2011-06-07 19:44:03

+0

只是写在二进制 – Vlad 2011-06-07 19:46:06

+0

我知道一些人非常执着于保持他们的数据可读性。所以(可能)而不是每字节256个值,编写规范的人选择每个字节(0-f)有16个值,并且它们可能表示为直接的ASCII值。 – vhallac 2011-06-07 19:50:12

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

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

谢谢。这个逆转就是让我循环的东西。 – Bob 2011-06-07 19:52:47

你的面具有以下几种:

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。