亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

以精確數量獲取項目的算法

以精確數量獲取項目的算法

catspeake 2022-12-24 09:46:23
我已經在兩款游戲中發現了這種算法/功能,但我一直想知道它背后的邏輯是什么?;旧?,有一個項目列表,每個項目都有一個 id。例如:item_1 的 ID:1item_2 的 ID:2item_3 的 ID:4item_4 有 id:8item_5 的 ID:16等等每個新項目都會將 id 乘以 2。然后有一個數字,比方說 4,表示當前項目是什么。這種情況是item_3,但棘手的部分是數字也可以一次選擇多個項目,例如 7 是 4 + 2 + 1 ( item_3, item_2, item_1) 或 17 是 16 + 1 ( item_5, item_1)。如果您有一個長列表并且對于多個選擇仍然非常準確,它可以像 16384 一樣非常高。我該如何解決這個問題?
查看完整描述

3 回答

?
12345678_0001

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]


查看完整回答
反對 回復 2022-12-24
?
呼啦一陣風

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”的數組/列表,你可以將它與一些循環或其他任何東西結合起來。


查看完整回答
反對 回復 2022-12-24
?
白豬掌柜的

TA貢獻1893條經驗 獲得超10個贊

在 Javascript 中,您可以獲取數字,將其轉換為二進制值,獲取位,將其反轉并獲取值(索引加一)或零以過濾真值。


var value = 13,

    items = [...value.toString(2)].reverse().map((v, i) => +v && (i + 1)).filter(Boolean);


console.log(items);


查看完整回答
反對 回復 2022-12-24
  • 3 回答
  • 0 關注
  • 137 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號