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

本文详细解析了位运算符的优先级与使用方法,包括按位取反、按位与、按位异或和按位或。介绍了如何利用位运算进行数值操作,如计算二进制位中1的数量、实现特定位的置位与清零,以及在博弈论中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

                       https://blog.youkuaiyun.com/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~~~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值