#includeint count_one_bits(unsigned int value)
return count;
}int main()
總結:
15 % 2 = 1(得出最後一位的數)
15 / 2 = 7(捨棄最後一位數)
count是用來計一的個數的
while迴圈的括號裡是要判斷真假的(1或0哦)
當我下一次迴圈的時候value的值將重新變化,,接著進入迴圈體 %2 == 1 後,則證明該數的二進位制中現在有乙個1,這時候 count++ ,則接下來神奇的事情發生了我用value /= 2,將捨棄二進位制的最後一位並將value重新賦值,而如果二進位制中有一位數是0,value進行和while迴圈括號裡的條件判斷,注意(現在n = 15已經執行到最後一次了n = 0)這時的0表示假則不進入迴圈體,然後執行return,返回給函式乙個count值然後列印出來。
我又換了9進行測試,發現第一次迴圈後value變成了4,4 % 2 != 1所以count不加一然後再發生一次神奇的變化把4變成2,然後就以此類推了哦!
程式優化:
int count_one_bits(unsigned int value)
return count;
}
x = x & (x - 1)這個運算是把x裡最低位的1,也就是最後乙個1給去掉,做一次運算少乙個1。
value只要能進來就至少有乙個1,這裡count要先加加。這裡是為了避免一種情況如:0001 & 0000 = 0000,如果這時候不先加加那麼下一次就不會進入迴圈,那麼那個0001中的1也就不會被統計到。
這個程式就優化了好多,比如我輸入乙個比較大的數2的32次方(二進位制反正就只有乙個1),如果用剛開始的那種方法就必須每次都算,要迴圈無數次,從而可見除法運算很麻煩的。而如果用現在的程式來看有幾個1就迴圈幾次,每次都少乙個1,只有乙個1就只需要迴圈一次1就被統計出來了,也不用管他在高位還是在低位,效率大大提公升,是不是很強大,既然這麼強大那再讓我們看一種。
在這裡再普及乙個知識:移位
程式設計中,
位操作運算子的一種。在c++中,移位運算子有雙目移位運算子:<<(左移)和》(右移)。移位運算子組成的
表示式也屬於
算術表示式
,其值為算術值。左移運算是將乙個二進位制位的
運算元按指定移動的位數向左移位,移出位被丟棄,右邊的空位一律補0。右移運算是將乙個二進位制位的
運算元按指定移動的位數向右移動,移出位被丟棄,左邊移出的空位或者一律補0,或者補符號位,這由不同的機器而定。在使用補碼作為機器數的機器中,正數的符號位為0,負數的符號位為1。
int count_one_bits(unsigned int value)
return count;
}
移位是效率最高的除法運算 判斷乙個整數的二進位制數里有幾個1
思路 先把整數 十進位制 轉為二進位制來處理吧,比如n 10,二進位制為1010 方法1 最簡單的當然是轉成二進位制後一位一位的比較。intcount 0 string a convert.tostring n,2 c 的進製轉化 a.tochararray for int i 0 i return...
統計二進位制數中有幾個1
題目 請實現乙個函式,輸入乙個整數,輸出該數二進位製表中1的個數。例如,把9表示成二進位制是1001,有兩位是1,因此,如果輸入9,則該函式輸出2。下面給出四種演算法 1.基本思路是判斷二進位制中最右邊一位是不是1 接著右移一位,此時右邊數起的第二位被移到了最右邊,再判斷是不是1 這樣每次移動一位,...
統計二進位制數 dp
題目描述 輸入乙個正整數m,請輸出從0到m中每乙個數字二進位制數中含有1的個數的總和,由於數值較大結果需要模100000.輸入格式 乙個m輸出格式 二進位制數中含有1的個數的總和s 輸入輸出樣例輸入2 輸出2輸入5 輸出7說明 提示 樣例說明 20 的資料 m 500 50 的資料 m 1000 7...