3 回答

TA貢獻(xiàn)1802條經(jīng)驗 獲得超5個贊
您描述的算法基本上是輸出 1 在數(shù)字的二進制表示中的位置。
對于 7,它的二進制表示是111。有三個1:分別在左起第一、第二、第三個位置,所以是第1、2、3項。注意我們是從左邊數(shù)的。
另一個例子:
對于 10,它的二進制表示是1010。有兩個 1:在左起第二個和第四個位置,因此輸出將是第 2 項和第 4 項。
這是 C# 中的一個實現(xiàn)。
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貢獻(xiàn)1802條經(jīng)驗 獲得超6個贊
不知道你正在談?wù)摰挠螒蚴侨绾螌崿F(xiàn)它的,但如果這是我,我會使用數(shù)字的二進制表達(dá)式中的位來實現(xiàn)它(java 中的示例代碼)。
public boolean isItemSelected(final int number, final int itemId) {
return (number & (1 << (itemId - 1))) != 0;
}
這里的技巧是數(shù)字的二進制表示(從右到左)已經(jīng)表示是否需要 1、2、4、8、16 等,以便僅使用 2 的冪來生成數(shù)字。左移只是使一個數(shù)字(二進制)全為 0,除了“itemId - 1”中的 1。如果該位1在給定的number. 然后檢查結(jié)果是否簡單 0地將其轉(zhuǎn)換為boolean.
顯然,如果你想構(gòu)建所有匹配的“itemIds”的數(shù)組/列表,你可以將它與一些循環(huán)或其他任何東西結(jié)合起來。

TA貢獻(xiàn)1893條經(jīng)驗 獲得超10個贊
在 Javascript 中,您可以獲取數(shù)字,將其轉(zhuǎn)換為二進制值,獲取位,將其反轉(zhuǎn)并獲取值(索引加一)或零以過濾真值。
var value = 13,
items = [...value.toString(2)].reverse().map((v, i) => +v && (i + 1)).filter(Boolean);
console.log(items);
添加回答
舉報