位運算(~ 、& 、^ 、|)

借鑑大佬博客:http://blog.sina.com.cn/s/blog_60e96a410100mjd2.html

                       https://blog.csdn.net/fuhuixin7497/article/details/78037265

位運算

 優先級別由高到低依次爲:按位取反( ~ ),按位與( & ),按位異或( ^ ),按位或( | )。

 1)按位取反(~)

        即0變1,1變0;

        用途   生成與系統無關的常數

           如:n=n&(~077)       將n的最低六位置0  (077二進制表示爲111111)

 2)按位與(&)

        0 & 0 = 1     0 & 1 = 0     1 & 0 = 0   1 & 1 =1

        即同爲1時結果才爲1,否則結果爲0

用途  (1)  lowbit(n)   用於計算n的二進制表示中最低位1出現的位置

int lowbit(int n){
	return n&(-n);
}

          (2) 計算n的二進制表示中又幾個1

int numOfOne(int n){
	int count=0;
	while(n){
		count++;
		n=n&(n-1);
	}
	return count;
}

                     當然還有另一種計算方法

int numOfOne(int n){
	int count=0;
	for(int i=0;i<32;i++){
		if(n>>i&1) count++;
	}
	return 0;
}

          (3)可以用來截取n的最低幾位

            如:    n&0177  (截取最低7位)   

                     n&077(截取最低六位)

                   當然  只要找好常數截哪裏都不是問題~~~

   3)按位異或(^) 

         0 ^ 0 = 0      0 ^ 1 = 1      1 ^ 0 = 1       1 ^ 1 = 0

        即不同爲1,相同爲0

        用途  題目有時會要求異或,在博弈論中的尼姆博弈中會用到     

    4)按位或(|)

         0  | 0 = 0      0 | 1 = 1      1 | 0 = 1       1 | 1 = 1

         即只要有1出現結果就是1,否則爲0

        用途   (1) 將n的二進制中的某幾位置1

                  如: n=n | 017   (將低4位置1)

                     (2)  取n的二進制位0的個數(高位補0)

int numOfZero(int n){
	int count=0;
	while(n+1){
		count++;
		n=n|(n+1);
	}
	return count;
}

                        當然有另一種方法

int numOfZero(int n){
	int count=0;
	for(int i=0;i<32;i++){
		if(!(n>>i&1))count++;
	}
	return 0;
}

如果想分別求出n的二進制表達中1的個數和0的個數(不包括高位) 怎麼辦呢?~

int numOf(int n){
	int count1=0,count2=0;
	while(n){
		if(n&1) count1++;//1的個數 
		else count2++;//0的個數 
		n>>=1; 
	}
}

over~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章