2016-10-05 1 views
1

Мы имеем следующие пункты для пользователя, чтобы выбрать из:Найти номер в сумме мощностей двух

  1. пункта 1
  2. пункт 2
  3. пункт 3
  4. предмета 4

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

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

Я хочу, чтобы проверить, выбран ли пользователь по item1 или item2 или item3 или item4 из уже выбранных значений. Как найти это в C# или ms-sql или в javascript?

+0

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

+0

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

+0

Исправление: вы говорите «если пользователь выбирает все элементы, а затем 30», но это должно быть «если пользователь выбирает все предметы, а затем 15» - потому что ваш наименьший элемент заказа должен быть представлен 2^0, а не 2^1 –

ответ

1

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

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

+0

Ссылки на побитовые операторы JavaScript см. По адресу http://www.w3schools.com/jsref/jsref_operators.asp. –

+0

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

+0

Вы проверяете второй бит. Просто сделайте 0110 & 0010 и проверьте, равно ли это нулю. Это, по существу, то, что делает (myNum & (1 << i)). – Nebr

-1

В 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-Method для получения всех установленных флагов.

Например,

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

должен вывести "элемент1, item4".

Edit:

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

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

Это должно напечатать "True".

+0

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

+0

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

+0

ОП выяснил вопрос сейчас, поэтому этот ответ выглядит хорошо. –

-2
done it in js . can you try it ? 


<pre> 
var number=30; 
while(number > 0) { 
if(number>=16) { number=number-16; alert("Item4"); } 
else if(number>=8) { number=number-8; alert("Item3"); } 
else if(number>=4) { number=number-4; alert("Item2"); } 
else if(number>=2) { number=number-2; alert("Item1"); } 
else { number=-1; } } 
</pre> 
Смежные вопросы