3 回答

TA貢獻1830條經驗 獲得超9個贊
如果二進制數是奇數,則最后一位(最低有效位)必須是1,因此減 1 就是將最后一位數字從 1 更改為 0(重要的是,這使數字成為偶數)。
如果二進制數是偶數,則最后一位必須為0,除以零只需完全刪除最后一位 0 即可完成。(就像以 10 為基數一樣,數字 10 可以除以 10,去掉最后的 0,留下 1。)
所以步數是每 1 位數字兩步,每 0 位數字一步 - 減 1,因為當你到達最后一個 0 時,你不再除以 2,你只是停止。
這是一個簡單的 JavaScript(而不是 Java)解決方案:
let n = '11100'; n.length + n.replace(/0/g, '').length - 1;
只需多做一點工作,如果需要的話,這也可以正確處理前導零“0011100”。

TA貢獻1995條經驗 獲得超2個贊
需要減去的次數就是 1 位的個數Integer.bitCount()
。您需要除法的次數是最高有效位的位置,即Integer.SIZE
(32,整數中的總位數)減去Integer.numberOfLeadingZeros()
減一(您不需要除法1
)。我假設對于零輸入,結果應該為零。所以我們有
int?numberOfOperations?=?integer?==?0???0?:?Integer.bitCount(integer)?+? ??Integer.SIZE?-?Integer.numberOfLeadingZeros(integer)?-?1;

TA貢獻1805條經驗 獲得超9個贊
根據給定的條件,如果數字是偶數,我們將其除以 2,這相當于刪除 LSB,同樣,如果數字是奇數,我們將減去 1 并將其設為偶數,這相當于取消設置設置位(更改 1)至 0)。分析上述過程我們可以說,所需的總步驟數將是(位數,即(log2(n)+1))和設置位數 - 1(最后的0不需要刪除)之和。
C++代碼:
result = __builtin_popcount(n) + log2(n) + 1 - 1;
result = __builtin_popcount(n) + log2(n);
添加回答
舉報