位運算 二進位制中1的個數12

2021-07-12 01:01:25 字數 1502 閱讀 6170

位運算:是把數字用二進位制表示之後,對每一次是0或1的運算。

乘除效率低,實際程式設計中盡可能的用移位運算代替乘除法。

世界上有10中人,一種人知道二進位制,而另一種人不知道二進位制……

五種位運算:與、或、異或、左移和右移,分別對應&、 |、 ^、<<、 >>。

異或:相同為0, 相異為1。

左移運算子m左移n,表示把m左移n位, 最左邊的n位將被丟棄。

右移要複雜些,右移時處理最左邊位: 如果數字是乙個無符號數值,則用0填補最左邊的n位。 如果數字是乙個有符號數值, 則用數字的符號位填補最左邊的n位; 即如果數字原先是正數,則用數字的右移之後最左邊補n個0; 若為負數補n個1。

求二進位制中1的個數

題目描述:實現乙個函式, 輸入乙個整數,輸出該二進位制表示中1的個數。 例如把9表示成二進位制是1001, 有2位是1。因此如果輸入9, 則函式輸出2。

解題思路:

將n與0001進行或操作,為true則計數,否則右移1位,知道n為0。此方法如果輸入是負數, 容易造成死迴圈。解法1:我們不採用上面的方法。而是使用乙個標記,初始化為1,對1做左移,然後與n做與&操作。知道1為0,這種解法的迴圈次數等於整數二進位制的位數。即32位二進位制迴圈32次。

解法2:此方法可以在有幾個1的情況下就迴圈幾次。原理:把乙個整數減去1,再和原來整數做運算,會把該整數最右邊乙個1變成0.那麼乙個整數的二進位制表示中有多少個1, 就可以進行多少次這樣的操作。

測試用例:

int main()
解法1函式實現:

int numberof1(int number)

return counts;

}

解法2函式實現:

int numberof1(int number)

return counts;

}

總結:把乙個整數減去1之後再和原來的整數做位與運算,得到的結果相當於是把整數的二進位制表示中的最右邊乙個1變成0。很多二進位制的問題都可以用這個思路解決。

//判斷乙個整數是不是2的整數次方

bool numberofsquare(int num)

二進位制位運算中 1 的個數

題目描述 現在夯夯和朱朱餓了,他們想去吃點東西,他們發現店裡東西的 都是2的次方倍 20,21,22 現在夯夯和朱朱想把他們的的錢全都用掉。想知道他們最少能吃多少東西,最多能吃多少東西?輸入格式 多組樣例,每組樣例佔一行,每行乙個整數,代表他們擁有的總錢數。輸出格式 分別回答他們的問題,答案用空格隔...

位運算之二進位制中1的個數

位運算是把數字用二進位制表示之後,對每一位上0或1的運算。位運算有五種運算 與 或 異或 左移 右移。例如 10001010 3 01010000 如果數字是乙個無符號數值,則用0填補最左邊的 n 位 如果數字是乙個有符號數值,則用數字的符號位填補最左邊的 n 位。例如 00001011 2 000...

模板 位運算 二進位制中1的個數

給定乙個長度為n的數列,請你求出數列中每個數的二進位制表示中1的個數。輸入格式 第一行包含整數n。第二行包含n個整數,表示整個數列。輸出格式 共一行,包含n個整數,其中的第 i 個數表示數列中的第 i 個數的二進位制表示中1的個數。資料範圍 1 n 100000,0 數列中元素的值 109 輸入樣例...