Как выполнять арифметику побитовых операций в MS-ACCESS - PullRequest
3 голосов
/ 02 февраля 2012

Внутри MSACCESS Я хочу использовать относительно простые побитовые операции в WHERE предложении запросов, таких как:

SELECT *
FROM Table1
WHERE Column1 (some operator) 8 = 0

Это будет:

  • Возвращать строки, где Column1 не установлен 4-й бит, например, 0, 1, 2, ..., 7 (все 4-й бит сброшен) и 16 (это 00010000b)
  • Исключить строки, где Column1 равно 8,9, 10, ..., 15 и т. Д.

PS: битовые операторы отличаются от логических операций?

Ответы [ 3 ]

5 голосов
/ 02 февраля 2012

вы можете:

WHERE (((column\(2^b)) mod 2) = 1)

редактировать: (где b - это определенный бит для проверки)

ИЛИ недоступно в Access, если вы не установили режим ANSI.

4 голосов
/ 02 февраля 2012

Если вы можете выполнить запрос в ANSI-92 Query Mode (например, изменив режим запроса Access UI или подключившись к нему с помощью ADO classic или ADO.NET), используйте BANDoperator.

Следующий пример кода выводит это в окно Immediate:

8 AND 7: -1 
8 BAND 7: 0 

В первом случае (AND) оба числа рассматриваются как значения True, поэтому True AND True дает -1 (True)).Я думаю, что подход BAND - это то, что вам нужно.

Public Sub BitwiseAndQuery()
    'the db engine treats numbers as booleans with AND '
    Debug.Print "8 AND 7: "; _
        CurrentDb.OpenRecordset("SELECT 8 AND 7")(0)

    'ADO includes BAND for bitwise AND '
    Dim rs As Object
    Set rs = CreateObject("ADODB.Recordset")
    rs.Open "SELECT (8 BAND 7)", CurrentProject.Connection
    Debug.Print "8 BAND 7:"; rs(0)
    rs.Close
    Set rs = Nothing
End Sub
1 голос
/ 02 февраля 2012

В VBA вы можете применять логические операторы к числам для выполнения побитовых операций

(13 AND 8) = 0

Однако в SQL это не работает. Однако вы можете написать функцию VBA, которую вы вызываете внутри запроса.

...