將乙個二進位制數里的1統計出來

2021-06-27 19:08:59 字數 1456 閱讀 4235

#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...