3 回答

TA贡献1802条经验 获得超5个赞
您描述的算法基本上是输出 1 在数字的二进制表示中的位置。
对于 7,它的二进制表示是111。有三个1:分别在左起第一、第二、第三个位置,所以是第1、2、3项。注意我们是从左边数的。
另一个例子:
对于 10,它的二进制表示是1010。有两个 1:在左起第二个和第四个位置,因此输出将是第 2 项和第 4 项。
这是 C# 中的一个实现。
public static List<int> FindOnes(int number) {
var list = new List<int>();
var binaryString = Convert.ToString(number, 2);
for (int i = 0 ; i < binaryString.Length ; i++) {
if (binaryString[binaryString.Length - i - 1] == '1') {
list.Add(i + 1);
}
}
return list;
}
// usage:
FindOnes(7) // [1,2,3]

TA贡献1802条经验 获得超6个赞
不知道你正在谈论的游戏是如何实现它的,但如果这是我,我会使用数字的二进制表达式中的位来实现它(java 中的示例代码)。
public boolean isItemSelected(final int number, final int itemId) {
return (number & (1 << (itemId - 1))) != 0;
}
这里的技巧是数字的二进制表示(从右到左)已经表示是否需要 1、2、4、8、16 等,以便仅使用 2 的幂来生成数字。左移只是使一个数字(二进制)全为 0,除了“itemId - 1”中的 1。如果该位1在给定的number. 然后检查结果是否简单 0地将其转换为boolean.
显然,如果你想构建所有匹配的“itemIds”的数组/列表,你可以将它与一些循环或其他任何东西结合起来。

TA贡献1893条经验 获得超10个赞
在 Javascript 中,您可以获取数字,将其转换为二进制值,获取位,将其反转并获取值(索引加一)或零以过滤真值。
var value = 13,
items = [...value.toString(2)].reverse().map((v, i) => +v && (i + 1)).filter(Boolean);
console.log(items);
添加回答
举报