找二進位制中0和1的個數的問題也是老生常談考察思維的一道題了。網上關於找二進位制中1的個數的已經論述很好,這裡也不花太多篇幅講找到1的個數原理。先直接上**
int n=0;
cin>>n;
intcount=0;
while(n)
cout<0;
下面花多一點篇幅來講講找到0的個數的方法。
一般來說找到二進位制數中0的個數,這個0的個數是相對於從最左邊第乙個1的位開始往右數起的個數
比如十進位制8—->(1000)2 有三個0
那麼呢找到0的個數自然只能用右移運算來計算了,但是要注意的是如果輸入數是負數的話,最高位作為符號位為置為1(比如-8—–>>>(1000.0000.0000.1000)2),此時右移運算並不會修改符號位,符號位會一直置1,所以不留意的話會出現死迴圈,這裡我們從右邊數起的最後乙個1的左邊的0不是我們要統計的0,所以我們可以先判斷這個數是不是負數,最後在正數的基礎上來統計,就不會出現死迴圈了。
下面是**
int n=0;
cin>>n;
if(n==0) return
1; if(n<0) n=-n;
intcount=0;
while(n)
n=n>>1;
} cout<0;
好了,再來貼一段**。
int n=0;
cin>>n;//n=1024
if(n==0) return
1; int
count=0;
while(~n)//while(n+1)
cout<0;
猜猜count最終的結果是多少?
答案是31。
迴圈的功能是什麼作用呢?結合例子可以猜到,是應該是統計0的個數,不過他是統計乙個int型別中全部0的個數,是不是很神奇,原理其實也是位運算,下面我們用乙個簡單的例子來做解釋,假設我們有乙個型別只有半個位元組的大小即4個位,當全部為置1後退出按程式邏輯就會退出迴圈。
初始n=8—>(1000)2
第一次運算後
n=(1000)|(1001)
n=1001=9
count=1
~n=0110
n+1=1010
第二次運算後
n=(1001)|(1010)
n=1011=11
count=2
~n=0100
n+1=1100
第三次運算後
n=(1011)|(1100)
n=1111=16
count=3
~n=0,退出迴圈
n+1=1.0000 //溢位了
可以看出每進行依次運算,都會把最右邊的0置為1,知道最後該型別的所有為都為1,此時如果加1的話就會溢位。因此上面的**可以統計乙個輸入數的二進位制表達中該型別的0的個數。是不是突然覺得位運算很奇妙呢?
二進位制中1的個數 二進位制中0的個數
1 題目 實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數,例如把9表示成二進位制是1001,有2位是1。因此如果輸入9,該函式輸出2。2 解法 解法 一 可能會引起死迴圈的解法 基本思路 先判斷整數二進位制表示中最右邊一位是不是1。接著把輸入的整數右移一位,此時原理處於從右邊數起的第二位...
二進位制找規律(數列)
powered by ab in 局外人 給定乙個正整數k 3 k 15 把所有k的方冪及所有有限個互不相等的k的方冪之和構成乙個遞增的序列,例如,當k 3時,這個序列是 1,3,4,9,10,12,13,該序列實際上就是 30,31,30 31,32,30 32,31 32,30 31 32,請你...
二進位制 二進位制起源
現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...