Найти число в сумме степеней двух

#javascript #c# #sql-server

#javascript #c# #sql-сервер

Вопрос:

У нас есть следующие элементы для пользователя на выбор:

  1. пункт 1
  2. пункт 2
  3. пункт 3
  4. пункт 4

Когда пользователь выбирает элемент (ы) и отправляет, мы сохраняем информацию, например

  • если выбраны элементы 1 и 2 (2 ^1, 2^2), то 2 4=6
  • если item1 и item3 (2^1, 2^3), тогда 2 8=10
  • предположим, если пользователь выбирает все элементы, то 30.

Я хочу проверить, выбрал ли пользователь элемент1 или элемент2 или элемент3 или элемент4 из уже выбранных значений. Как найти это в c # или ms-sql или в javascript?

Комментарии:

1. Рассмотрим число в его двоичной форме. Каждая цифра, для которой установлено значение 1, является выбранным элементом. Каждая цифра, для которой установлено значение 0, является невыбранным элементом.

2. Итак, по сути, вы знаете только конечную сумму, и вы хотите выяснить, какие элементы были выбраны пользователем. Скажите, если sum= 12 тогда ваш результат будет таким, что были выбраны item2 и item3. Я прав??

3. Исправление: вы говорите if user select all the items, then 30 , но это должно быть if user select all the items, then 15 — потому что ваш элемент самого низкого порядка должен быть представлен 2 ^ 0, а не 2 ^ 1

Ответ №1:

По сути, представление числа в виде суммы степеней двойки — это то, что представляет собой представление двоичных чисел. Рассмотрим 19 = 1 2 16 , таким образом, двоичный файл равен 10011. Если вы хотите проверить, содержит ли сумма определенную степень двойки, вы можете использовать побитовые операции

if(myNum amp; (1 << i)) проверит, установлен ли i-й бит, или, другими словами, содержит ли сумма 2 в степени i.

Комментарии:

1. Ссылки на побитовые операторы JavaScript см. w3schools.com/jsref/jsref_operators.asp .

2. Спасибо. Но я не понимаю в проверке бита. если пользователь выбрал item1 и item2, то результат равен 6. Для 6 двоичный код равен 0110, для 2 двоичный код равен 10. Как мне проверить, существует ли 2 в 6.

3. Вы проверяете второй бит. Просто выполните 0110 и 0010 и проверьте, равно ли это нулю. По сути, это то, что делает if(myNum amp; (1 << i)) .

4. Вы берете 00 ….001 (что равно 1), затем сдвигаете его на 2 бита влево и получаете 00 ….00100 (что равно 1 << i), затем и это с вашим номером

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

Ответ №2:

В C # используйте поле перечисления с такими флагами:

 [Flags] // This Attribute ensures that these items are handled as flags
public enum itemFlags
{
    None = 0
    item1 = 1,
    item2 = 2,
    item3 = 4,
    item4 = 8
}
  

Важно, чтобы все значения были степенями 2, и чтобы у вас было None = 0 (если флаг не установлен). Затем вы можете использовать toString-метод для получения всех установленных флагов.

Например,

 Console.WriteLine(((itemFlags)9).ToString())
  

должен выводить «item1, item4».

Редактировать:

Чтобы узнать, выбран ли флаг, вы также можете использовать метод HasFlags:

 itemFlags myFlags = itemFlags.item1 | itemFlags.item3;
bool isItem1Selected = myFlags.HasFlag(itemFlags.item1);
Console.WriteLine(isItem1Selected.ToString());
  

Это должно вывести «True».

Комментарии:

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

2. Я понял это так, что OP хотел узнать из уже выбранной комбинации (например, «10»), какие флаги установлены?

3. OP теперь прояснил вопрос, поэтому этот ответ выглядит хорошо.