Вопрос о битовой маске - PullRequest
       22

Вопрос о битовой маске

2 голосов
/ 07 июня 2011

Читая документацию для системы торговой точки, вот пример, который они дают для маски, которая должна сообщить вам, какие места выбраны. Я не могу понять это. Я полностью понимаю немного маскировки. Этот пример просто неверен?

Функция

Эта системная переменная представляет собой строку из восьми символов, которая содержит маску фильтра сиденья.

Тип / размер

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 ]

2 голосов
/ 07 июня 2011

Это 8-значные шестнадцатеричные числа, которые могут хранить до 32-значных двоичных чисел.

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

В двоичном представлении каждая цифра соответствует месту:

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

Первый двоичный бит предназначен для места № 1, а последний - для места № 32. Поскольку они дают вам 8-символьную строку, вы, вероятно, захотите разобрать ее в 32-битное значение, чтобы выполнить арифметику маскирования. Ищите «шестнадцатеричная строка в целое число» на целевом языке, и вы найдете что-то вроде:

Преобразование шестнадцатеричной строки в int в Python

Примечание. Google может выполнять базовые преобразования для вас, когда вы смотрите на такие вещи, как ( "0x50a00000 в двоичном виде" ), но Wolfram Alpha делает немного больше:

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

2 голосов
/ 07 июня 2011

конвертирует каждую из цифр по одной за раз в 4-битный двоичный файл.

80000000 -> 1000 0000 ....
50A00000 -> 0101 0000 1010 ...
1 голос
/ 07 июня 2011

Ваши маски следующие:

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 иодиннадцать.

1 голос
/ 07 июня 2011

Пример кажется верным.Они просто поменяли местами самые значимые и наименее значимые биты и использовали индекс на основе 1 для позиций битов (не считая данные в ASCII вместо 4-х байтов шестнадцатеричных).Таким образом, если установлен бит n (младший бит = 0 или значение 00000001), вы получите номер места 31-n+1.

...