Сортировать по количеству битов, установленных в битовой маске - PullRequest
2 голосов
/ 18 апреля 2020

В моей таблице есть поле, которое представляет битовую маску. Я хотел бы отсортировать таблицу по количеству установленных битов по убыванию.

Например, битовая маска 8 в двоичном виде равна 1000, то есть здесь установлен только один бит, а битовая маска 10 равна 1010 он имеет два установленных бита, поэтому он должен быть выше 8.

Другой пример: 16 - это 10000 в двоичном формате, поэтому он должен быть ниже, чем 1010 (10 ), который содержит два.

Пример ниже, вот таблица без сортировки

| bitmask |    bitmask binary for convenience
-----------
| 3       |    0000011   (2 bits set)
| 64      |    1000000   (1 bit set)
| 49      |    0110001   (3 bits set)
| 15      |    0001111   (4 bits set)

И какую сортировку я пытаюсь достичь:

| bitmask |    bitmask binary for convenience
-----------
| 15      |    0001111   (4 bits set)
| 49      |    0110001   (3 bits set)
| 3       |    0000011   (2 bits set)
| 64      |    1000000   (1 bit set)

В другом словами, запись должна быть выше, если в двоичном представлении установлено больше битов.

Я понимаю, что, вероятно, мне следует взять каждое число, получить его двоичное представление и проверить, какие биты установлены.

Затем как-то отсортировать по этому значению .

Но я совершенно не уверен, как этого добиться только с MySQL.

Может ли кто-нибудь дать подсказку или решение

Ответы [ 2 ]

3 голосов
/ 18 апреля 2020

Вы можете использовать функцию bin для возврата двоичного представления битовой маски. Оттуда, грязный трюк, который вы могли бы использовать, чтобы получить popcount битовой маски, состоит в том, чтобы заменить нули пустыми строками и затем проверить длину результата:

SELECT   bitmask
FROM     mytable
ORDER BY LENGTH(REPLACE(BIN(bitmask), '0', ''))
0 голосов
/ 23 апреля 2020
ORDER BY BIT_COUNT(bitmask)

Работает, если bitmask равно BIGINT (или меньше) или BINARY. С версией 8.0 она работает и в BLOBs.

SELECT BIN(1234), BIT_COUNT(1234);
+-------------+-----------------+
| BIN(1234)   | BIT_COUNT(1234) |
+-------------+-----------------+
| 10011010010 |               5 |
+-------------+-----------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...