找二進位制0 和1

2021-07-31 06:52:48 字數 1486 閱讀 9994

找二進位制中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年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...