【问题标题】:Find a number in the sum of power of two在两个的幂和中找到一个数
【发布时间】:2023-03-19 22:05:01
【问题描述】:

我们有以下项目供用户选择:

  1. 项目 1
  2. 项目 2
  3. 项目 3
  4. 项目 4

当用户选择商品并提交时,我们会保存类似的信息

  • 如果 item1 和 item2 (2^1, 2^2) 被选中,则 2+4=6
  • 如果 item1 和 item3 (2^1, 2^3),那么 2+8=10
  • 假设,如果用户选择所有项目,那么 30。

我想检查用户是否从已选择的值中选择了 item1 或 item2 或 item3 或 item4。 如何在 c# 或 ms-sql 或 javascript 中找到它?

【问题讨论】:

  • 考虑二进制形式的数字。设置为 1 的每个数字都是一个选定项。每个设置为 0 的数字都是未选中的项目。
  • 所以基本上,你只知道最终的总和,你想知道用户选择了哪些项目。假设sum= 12 那么你的结果将是 item2 和 item3 被选中。我说的对吗??
  • 更正:您说if user select all the items, then 30,但这应该是if user select all the items, then 15 - 因为您的最低订单项应该用2^0而不是2^1表示

标签: javascript c# sql-server


【解决方案1】:

基本上,将数字表示为 2 的幂的和就是二进制数表示的全部内容。考虑 19 = 1 + 2 + 16,所以二进制是 10011。如果要检查总和是否包含 2 的特定幂,可以使用 bitwise operations

if(myNum & (1 << i)) 将检查是否设置了第 i 个位,或者换句话说,是否包含 2 的 i 次方。

【讨论】:

  • 有关 JavaScript 位运算符参考,请参阅w3schools.com/jsref/jsref_operators.asp
  • 谢谢。但我不明白检查位。如果用户选择了 item1 和 item2,则结果为 6。对于 6 二进制是 0110,对于 2 二进制是 10。如何检查 6 中是否存在 2。
  • 你检查第二位。只需执行 0110 和 0010 并检查这是否为零。这基本上就是 if(myNum & (1
  • 你取 00....001(即 1),然后将其向左移动 2 位,得到 00....00100(即 1
  • 对不起,我无法理解这个计算。可以给个参考吗?
【解决方案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-Method 来获取所有设置的标志。

例如,

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

应该输出“item1, item4”。

编辑:

要判断一个标志是否被选中,也可以使用HasFlags-Method:

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

这应该打印“真”。

【讨论】:

  • OP 想要组合这些值,因此您应该提供示例代码来演示如何组合它们(使用|
  • 我的理解是,OP 想从已经选择的组合(如“10”)中找出设置了哪些标志?
  • OP现在已经澄清了这个问题,所以这个答案看起来不错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多