Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Битовая сумма id (https://javascript.ru/forum/misc/80370-bitovaya-summa-id.html)

Bond 28.05.2020 16:41

Битовая сумма id
 
Всем привет.
Подключаюсь к одной апишке и есть такая тема - есть пост запрос с формы - в форме есть мультиселект - Тип кузова - отправлять нужно id кузовов - но не в массиве а битовую сумму id кузовов и тип int64
Что это значит и зачем так сделано, почему не массив?

laimas 28.05.2020 17:17

Цитата:

Сообщение от Bond
Что это значит

Нахождение суммы битов числа (одного). Например, 45 = 101101 = 4 бита в числе.

Цитата:

Сообщение от Bond
зачем так сделано, почему не массив?

Трудно сказать зачем, а тем более для множества значений. Что из себя представляют эти id, можете их перечислить?

PS. Я могу и ошибаться, но скорее вы не так трактуете задачу и речь идет не о сумме бит, а побитовом ИЛИ, то есть сложении. При этом значения списка, это не id, а значения поля типа SET, которые представляют бит с шагом степени 2, то есть 1, 2, 4, 8, .... К примеру если будут выбраны 2 и 3 опции, то результат будет:

0010
0100
------
0110 = 6

что и требуется для записи в базу.

Bond 28.05.2020 17:30

laimas,
id - обычное число - например 1, 2, 54, 63 и даже такие 131072 - это чисто их внутренний учет айдишек. Вот несколько таких значений нужно отправлять, или одно значение если выбран один тип кузова.

laimas 28.05.2020 17:35

Цитата:

Сообщение от Bond
id - обычное число - например 1, 2, 54, 63

Я был прав, смотрите посткриптум. Это SET, в базе он хранится как строки, а во внутреннем представлении это числа. 64 разряда, это максимальное что может быть для этой разрядности, то есть 64 значения.

Например, в базе будет так

1 - Первый
2 - Второй
......

Также хранится и ENUM, но в нем можно выбрать одно значение из множества, а в SET многое из множества, поэтому и сумма. Сделайте побитое ИЛИ над значениями выбранных опций, получится то, что требуется.

Vlasenko Fedor 28.05.2020 17:57

если там тип int то значит сложить их вместе

laimas 28.05.2020 18:07

Цитата:

Сообщение от Vlasenko Fedor
если там тип int

Конечно он, о чем и речь, что это сумма чисел, просто каждое число представлено одним битом. То есть проще (упрощаем):

var sum = [...document.querySelectorAll('[selected]')].reduce((a, b) => a | b.value, 0)

нежели
var sum = [...document.querySelectorAll('[selected]')].reduce((a, b) => a += +b.value, 0)

Bond 28.05.2020 18:11

Vlasenko Fedor,
int64 - и в описании просто написано без примера - Битовая сумма id кузовов
а сложить вместе тоже есть такое поле - тип загрузки вот там тип int
Вот его описание из документации
Битовая сумма id типов загрузки. Например: только "Верхняя" будет иметь значение 1; "Верхняя", "Боковая" и "Со снятием стоек" имеют значение 67 (1 + 2 + 64)
Вот там айдишки идут - 1 2 4 8 16 32 64 128 и т.д

Bond 28.05.2020 18:15

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

laimas 28.05.2020 18:22

Цитата:

Сообщение от Bond
Битовая сумма id типов загрузки. Например: только "Верхняя" будет иметь значение 1; "Верхняя", "Боковая" и "Со снятием стоек" имеют значение 67 (1 + 2 + 64)

Это не битовая сумма, это сумма всех значений. Например, чтобы получить из базы не "Верхняя", "Боковая" и "Со снятием стоек", а сумму их, то в запросе к базе делают так: field_name+0. Если же нужно текстовое, то field_name.

http://www.mysql.ru/docs/man/SET.html

А битовая сумма, это сумма бит в числе, есть такое понятие, посмотреть можно например тут https://neerc.ifmo.ru/wiki/index.php...ераци - Подсчет количества единичных битов

Bond 28.05.2020 18:33

Цитата:

Сообщение от laimas
Это не битовая сумма

Да, но это я цитировал описание из документации этого АПИ.

laimas 28.05.2020 18:35

Цитата:

Сообщение от Bond
цитировал описание из документации этого АПИ

Ну значит описание имеет двоякий смысл, но тот кто знает о SET (а это тип используется не только в базах), тот скорее поймет о чем речь.

Vlasenko Fedor 28.05.2020 18:44

Цитата:

Сообщение от laimas
но тот кто знает о SET

сам же писал в ограниченности SET (64)
смысл не в этом, смыл хранить значения характеристик одним числом обычным интом в базе. так делают с фильтрами, поиском по ним используя битовые операции в базе

laimas 28.05.2020 18:52

Цитата:

Сообщение от Vlasenko Fedor
смысл не в этом, смыл хранить значения характеристик одним числом обычным интом в базе

А я разве что-то иное имел ввиду? А ограничение только в разрядности и они не мною определены, а API.

Bond 28.05.2020 19:19

Vlasenko Fedor,
laimas,
спасибо за подсказки, с меня + в карму.
как оказалось и в типе кузова и в типе загрузки нужна просто сумма id. То что они делают побитово в бд это уже их проблемы - зачем они это прописали в апи для фронта хз. Да и сама документация к апи на коленке написана.

laimas 28.05.2020 19:22

Цитата:

Сообщение от Bond
зачем они это прописали в апи для фронта хз

Для понимания того, с чем вы работаете. Да и при побитовой операции не потребуется явного преобразования значений опций в число как в случае с просто сложением.

laimas 28.05.2020 19:37

Цитата:

Сообщение от Bond
почему не массив?

Кстати теперь и на это ответить можно - это легче проверить при фильтрации данных извне, одно число, это весь набор выбранных из множества. Его значения это, от мин. значения равное 1, до макс. значения, это (2 в степени количества отведенного под множество) минус 1.

Malleys 29.05.2020 08:47

Цитата:

Сообщение от Rise
в JS можно 32 позиции использовать

Это вы про тип Number, хотя в нём фактически безопасно можно использовать 53-бита
alert(Math.log(Number.MAX_SAFE_INTEGER) / Math.log(2));
Если же говорить про целые числа, то в них можно описать сколь угодно сложные маски — например, одна 256-битная маска может описывать все типы в форме, свойства товара и пр.

laimas 29.05.2020 09:41

О битовой маске можно вести речь в контексте операций с множеством - выборка, поиск, фильтрация. А сумма значений, это просто набор выбранных значений множества.

Malleys 29.05.2020 16:52

Цитата:

Сообщение от Rise
новый примитив BigInt

Почему новый? В Chrome уже ровно два года есть.

Цитата:

Сообщение от Rise
нет таких ограничений

А я разве писал, что такие ограничения есть у целых чисел?


Часовой пояс GMT +3, время: 20:42.