3 回答

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

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

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