突然想把自己每天學到的知識記錄下來,於是乎產生了這篇博客。
這一篇博客的主要目的是通過寫一個函數使其能夠返回參數二進制中1的個數,方法一共有三種。
第一種方法十分簡單。我們舉一個十進制數字的例子,更易理解。
我們要想統計十進制數字中出現的1的個數,只需要對這個數字進行“/10”與“%10”運算。比如對數字119,119 % 10 = 9,我們得到了這個數字的個位數,觀察其個位數與1是否相等,相等的話1的個數就加一;然后進行整除運算119 / 10 = 11,由此我們丟棄了這個數字的個位數,得到了這個數字的前兩位數。依次類推,我們再對11進行這兩步運算,可以得到其個位數與除去個位數的數字。我們只要判斷得到的個位數中1的個數即可。
對二進制亦是如此,只不過除數從10變為了2。代碼如下。
int count_bit_one(unsigned int n) //unsigned是考慮到輸入的數字可能為負數 { int count = 0; while (n) { if (n % 2 == 1) //即該二進制最后一位為1 count++; n = n / 2; //得到除去最后一位的二進制序列 } return count; } int main() { int a = 0; scanf("%d", &a); int count = count_bit_one(a); //定義一個函數能夠數‘1’ printf("count = %d\n", count); return 0; }
第二種方法相較於第一種更為簡便,我們通過‘>>’操作符與‘&’操作符來實現該函數。
‘&’操作符只有兩個都為1才會返回1,比如說,10101&00001=00001,我們可以利用這一特點來判斷該二進制序列中最后一位是否為1,判斷完最后一位后,我們希望能夠判斷倒數第二位的情況,我們可以借鑒第一鍾方法的思想,通過‘>>’操作符——左邊補0,右邊丟棄——來實現。通過右移操作符,我們丟棄了該二進制序列的最后一位,並且在左邊補0(這使得最終的結果不會受到影響),因此我們可以判斷原二進制序列倒數第二位的情況。以此類推,我們可以計算出整個二進制序列中1的個數。代碼如下。
int count_bit_one(int n) { int count = 0; int i = 0; for (i = 0; i < 32; i++) //占32個bit位 { if (((n >> i) & 1) == 1) { count++; } } return count; } int main() { int a = 0; scanf("%d", &a); int count = count_bit_one(a); printf("count: %d", count); return 0; }
第三種方法十分巧妙。我們隨便書寫一個二進制序列:1101,1101&1100,得到1100,我們發現原二進制中最右邊的1消失了;再將1100&1011,得到1000,發現二進制序列中1100最右邊的1也消失了。由此我們可以看到,當進行運算“n=n&(n-1)”時,會使得n的二進制序列的最右邊的1消失,我們可以利用這種特性來計算二級制序列中1的個數。代碼如下。
int count_bit_one(int n) { int count = 0; while (n) { n = n & (n - 1); count++; } return count; } int main() { int a = 0; scanf("%d", &a); int count = count_bit_one(a); printf("count:%d", count); return 0; }
這是俺的第一篇博客,格式、條理啥的可能都很混亂,但是,我會繼續努力的!對於文中的錯誤,歡迎大家指出,先提前謝謝大家啦!讓我們共同進步!