方法一:
思路:迴圈進行以下操作,直到n被縮減為0:
1. 用該資料模2,檢測其是否能夠被2整除
2. 可以:則該資料對應二進位制位元位的最低位一定是0,否則是1,如果是1給計數加1
3. 如果n不等於0時,繼續1
intcount_one_bit
(int n)
return count;}
上述方法缺陷:進行了大量的取模以及除法運算,取模和除法運算的效率本來就比較低。
方法二思路:
乙個int型別的資料,對應的二進位制一共有32個位元位,可以採用位運算的方式一位一位的檢測,具體如下
intcount_one_bit
(unsigned
int n)
return count;}
方法二優點:用位操作代替取模和除法運算,效率稍微比較高
缺陷:不論是什麼資料,迴圈都要執行32次
方法三:
思路:採用相鄰的兩個資料進行按位與運算
舉例:9999:10
0111
0000
1111
第一次迴圈:n=
9999 n=n&
(n-1)=
9999
&9998
=9998
第二次迴圈:n=
9998 n=n&
(n-1)=
9998
&9997
=9996
第三次迴圈:n=
9996 n=n&
(n-1)=
9996
&9995
=9992
第四次迴圈:n=
9992 n=n&
(n-1)=
9992
&9991
=9984
第五次迴圈:n=
9984 n=n&
(n-1)=
9984
&9983
=9728
第六次迴圈:n=
9728 n=n&
(n-1)=
9728
&9727
=9216
第七次迴圈:n=
9216 n=n&
(n-1)=
9216
&9215
=8192
第八次迴圈:n=
8192 n=n&
(n-1)=
8192
&8191=0
可以觀察下:此種方式,資料的二進位制位元位中有幾個1,迴圈就迴圈幾次,而且中間採用了位運算,處理起來比較高效
面試題 二進位制
之前論壇看到乙個面試題,很基礎的考察按位符運算,總結如下 按位與 只有對應的兩個二進位均為1時 結果位才為 1,否則為0。舉例 比如9 5,其實就是1001 101 1,因此9 5 1 規律 二進位制中,與 1相 就保持原位,與 0相 就為 0int fun int nvalue return nc...
負二進位制的面試題
今天看到一篇關於面試atc的心得,呵呵,裡面提到了乙個負二進位制的題目 d m 也真夠能折騰的。1.如何用負二進位制表述十進位制等式5 3 8?原題 解 dcba 2 d 2 3 c 2 2 b 2 1 a 2 0 dec d 2 3 c 2 2 b 2 1 d dec 則 101 neg bin ...
筆試面試題 天平稱重與二進位制
有人曾問帳前卒一道題 至少需要多少個砝碼,才能稱出1 50g物體?這道題有兩個變種 1.至少需要多少砝碼 左物右碼 才能稱出1 50g物體?2.至少需要多少砝碼 砝碼可以放在任意一邊 才能稱出1 50g物體?第一問可以變為 至少多少個數字相加,可以表示1 50之間的任意數。又可以演變為 如何快速的從...