二进制运算

常用的位操作
1.判断奇偶
(x&1)1 等价于 x%21 也就是奇数
(x&1)0 等价于 x%20 也就是偶数
2.x/2 等价于x>>1
3.x&=(x-1) 把最低位的二进制1去掉
4.(x>>n)&1获取x第n位的值
5.x&(~0<<n)将右边n位清零
6.x&(~0>>n)将左边n位清零
7.x|(1<<n)将第n位置为1
8.x&(~(1<<n))将第n位置为0

1.统计二进制中1的个数

十进制/10去掉最后一位
二进制/2也是去掉二进制的最后一位
十进制%10得到最后一位
二进制%2也是得到二进制的最后一位

如果二进制数%2的结果为0,那么二进制最后一位的结果为0
如果二进制数%2的结果为1,那么二进制最后一位为1

int count_one_bit(int n){
int count=0;
while(n){
   if(n%2==1){
   count++;
   }
   n/=2;
   }
   return count;
  }//此方法对负数不成立
  修改:int count_one_bit(unsigned int n){
 int count=0;
 while(n){
   if(n%2==1){
   count++;
   }
   n/=2;
   }
   return count;
  }
int count_one_bit(int n){
int coun=0;
for(i=0;i<32;i++){
if((num>>i)&1)==1){//向右移动i位num本身是不会发生变化的
count++;
}
}
return count;
}//固定循环32次,不够高效
int count_one_bit(int n)
{
	int count = 0;
	while(n)//n不是0,其二进制位就存在1
	{
		n = n&(n-1);
		count++;
	}
	return count;
}
//n=n&(n-1)该表达式每执行一次,n的二进制最右边的1就会消失,,数据的二进制比特位中有几个1,循环就循环几次
类似的,n=n&(n-1)代表着将二进制数最右边的1变为0,而n=n|(n+1)则代表着将二进制数最右边的0变为1
int fun(unsigned int x) {
        int n = 0;
        while (x + 1) {
            n++;
            x = x | (x + 1);
        }
        return n;
      }
    //这个作用是对整型中0的个数进行统计,x=x|(x+1)的作用是每次循环把x二进制中从右往左数的最后一位0变为1,直到变成全1时x+1溢出

2.如何判断一个数是不是2的幂次方
2的幂次方的数,二进制中只有1个1
n&(n-1)=0
3.打印二进制的奇数位和偶数位

void Printbit(int num)
{
	for(int i=31; i>=1; i-=2)
	{
		printf("%d ", (num>>i)&1);
	}
	
	printf("\n");
    
	for(int i=30; i>=0; i-=2)
	{
		printf("%d ", (num>>i)&1);
	}
	printf("\n");
}

4.求两个二进制位不同的位数
两种方法,可以一位一位的来进行判断,也可以通过异或操作来判断

void count_diff_one(int m, int n)
{
	int i = 0;
	int count = 0;
	for (i = 0; i < 32; i++)
	{
		if (((m >> i) & 1) != ((n >> i) & 1))
		{
			count++;
		}
	}
	printf("%d\n", count);
}
int main()
{
	int m = 0;
	int n = 0;
	scanf("%d %d", &m, &n);
	count_diff_one(m, n);
	
	return 0;
}
int calc_diff_bit(int m, int n)
{
	int tmp = m^n;
	int count = 0;
	while(tmp)
	{
		tmp = tmp&(tmp-1);
		count++;
	}
	return count;
}
for(int i=0;i<32;i++){
result=(result<<1)+((n>>i)&1);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值