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

借鉴大佬博客: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 = 0     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~~~

你可能感兴趣的:(C++)