題目:輸入兩個整數,求兩個整數二進制格式有多少個位不同
前置問題引入
輸入一個整數 n ,輸出該數32位二進制表示中1的個數,其中負數用補碼表示,
tips:求的是補碼的二進制個數
C語言代碼解決 ——方法一
利用 >> 與 按位與& 實作計算函式的操作size_t count_bit_one(int n) { int i = 0; int count = 0; for (i = 0; i < 32; i++) { if (((n >> i) & 1) == 1) count++; } return count; }int main() { int num = 0; scanf("%d", &num); int ret = count_bit_one(num); printf("%d", ret); return 0; }
方法二
這邊有個關鍵點是要使用 “unsigned int”,要不然會導致負數傳入后無法正常使用該函式
size_t count_bit_one(unsigned int n) { int count = 0; while (n) { if (n % 2 == 1) count++; n /= 2; } return count; }
方法三 (best)
N = N & (N - 1)
size_t count_bit_one(unsigned int n) { int count = 0; while (n) { n = n & (n - 1); count++; } }圖片決議
拓展思考
我們可以運用方法三的方式去解決另外一個問題
:如何判斷一個數是不是2的n次方數(等價于判斷二進制碼中是否只有一個1)
我們可以這樣:
if( n & (n - 1) == 0) { //n就是2的次方數 }大家可以思考思考為什么哦?
題目:輸入兩個整數,求兩個整數二進制格式有多少個位不同
方法一
int main() { int n1 = 0; int n2 = 0; scanf("%d%d", &n1, &n2); int count = 0; int i = 0; for (i = 0; i < 32; i++) { if (((n1 >> i) & 1) != ((n2 >> i) & 1)) count++; } printf("%d\n", count); return 0; }也可以選擇封裝成一個函式哦
方法二
int main() { int n1 = 0; int n2 = 0; scanf("%d%d", &n1, &n2); int t = n1 ^ n2; int count = 0; while (t) { t = t & (t - 1); count++; } printf("%d\n", count); return 0; }結合引入問題的方法來進行解決
補充題
列印整數二進制的奇數位和偶數位
int main() { int num = 0; scanf("%d", &num); int i = 0; for (i = 31; i >= 1; i -= 2) { printf("%d ", (num >> i) & 1); } printf("\n"); printf("奇數位\n"); for (i = 32; i >= 1; i -= 2) { printf("%d ", (num >> i) & 1); } printf("\n"); printf("偶數位"); return 0; }
這就是今天的全部內容啦,如果覺得有幫助的話,請給小玄:
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/307355.html
標籤:其他


