1. 程式人生 > 其它 >劍指offer 15 : 二進位制數中1的個數(操作符:左移、右移、&(與))

劍指offer 15 : 二進位制數中1的個數(操作符:左移、右移、&(與))

技術標籤:操作符c語言

目錄

二進位制中1的個數

一、考點

操作符 左移 << 的使用
操作符 & 的使用

二、考點筆記

1.左移操作符 “<<”
它是對二進位制數進行操作的。
將二進位制向左邊移動一位,右邊自動補0。
舉例:

如7的二進位制為:(一共32位)
00000000000000000000000000000111
對7左移一位:(結果是14)
00000000000000000000000000001110

程式碼:

int main(){
	int a = 7;
	a = a << 1;
	printf("%d\n",a);
	return 0;

}

結果:

14

2.右移操作符 “>>”
右移稍微複雜一點,分為
邏輯右移:不管數的正負,向右移動後自動補0
算術右移 :移動後,正數補0,複數補1(因為它是符號位,0表示負數,1表示正數)
c語言裡右移操作是算術右移

舉例:(涉及到了整數在記憶體中的儲存方式,這一塊不做詳解)

-1的二進位制為:
10000000000000000000000000000001(原碼)
11111111111111111111111111111110(反碼)
11111111111111111111111111111111(補碼)
右移一位:
11111111111111111111111111111111 (最左邊補的是符號位1)
結果 -1

程式碼

int main
(){ int a = -1; a = a >> 1; printf("%d\n",a); return 0; }

結果:

-1

3.與操作符&
兩個整數 用 & 運算:將兩個數的二進位制(補碼)逐位比較,都為1是該位為1,否則為0
舉例

7 & 5
7和5的二進位制:
00000000000000000000000000000111(7)
00000000000000000000000000000101(5)
結果
00000000000000000000000000000101 (5)

程式碼:

int main(){
	int a = 7;
	int b = 5;
	int c = a & b;
	printf("%d\n",c);
	return 0;
}

結果

5

三、題目與解題

題目

請實現一個函式,輸入一個整數(以二進位制串形式),輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。

程式碼解決

int hammingWeight(uint32_t n) {
    unsigned int a = 1;
    int count = 0;
    for(int i = 1;i <=32;i++){
        if(n & a){
            count++;
        }
        a = a << 1;
    }
   return count;
}