位运算的奇技淫巧

这篇博客介绍了在C++中计算一个整数二进制表示中1的个数的四种方法,包括直接计数、位运算以及移位操作。文章详细解释了左移和右移操作符的不同规则,并强调了负数在右移时的特殊处理。此外,还展示了如何通过位操作高效地消除最右侧的1并计数。
摘要由CSDN通过智能技术生成

左移操作符 移位规则:
左边抛弃、右边补0
右移操作符 移位规则:

  1. 逻辑移位 左边用0填充,右边丢弃(无符号数)
  2. 算术移位 左边用原该值的符号位填充,右边丢弃(有符号数)
    注:对于移位运算符,不要移动负数位
//求一个整数存储在内存中二进制中1的个数 四种方法
#include<stdio.h>
int countBit1(int num)
{
	int count = 0;
	while (num)
	{
		if (num % 2 == 1)
		{
			count++;
		}
		num /= 2;
	}
	return count;
}

int countBit2(int num)
{
    //左移
	int count = 0;
	int len = sizeof(int) * 8;
	int i = 0;
	while (i < len)
	{
		if (num & (1 << i))
		{
			count++;
		}
		i++;
	}
	return count;
} 

int countBit3(int num)
{
	//右移只限于无符号数或有符号数的正值(负值右移会补符号位) 
	int count = 0;
	int len = sizeof(int) * 8;
	int i = 0;
	while (i < len)
	{
		if ((num >> i) & 1)
		{
			count++;
		}
		i++;
	}
	return count;
}

int countBit4(int num)
{
    //效率最高
	int count = 0;
	while (num)
	{
	    //没执行一次循环,消掉一个1
		num &= (num-1);
		count++; 
	}
	return count;
}

int main()
{
	//求一个整数存储在内存中二进制中1的个数 
	printf("%d\n", countBit1(0xff));
	printf("%d\n", countBit2(0xff));
	printf("%d\n", countBit3(0xff));
	printf("%d\n", countBit4(0xff));
}
#include<stdio.h>
int main()
{
    定义 int(有符号数) unsigned (无符号数)
    //%u 无符号数 %d有符号数
    //~按位取反,!逻辑取反 
    printf("%u\n", ~0); //1111 ... 1111 无符号数 
    printf("%u\n", !0); //1 真 
	printf("%d\n", !0); //1 真 
	printf("%d\n", ~0); //1111 ... 1111(补)有符号数 1000 ... 0001(原码)  
	unsigned int a = -1;
	printf("%u\n",a);//无符号数存负数,存入的是补码 
	printf("%u\n", a >> 1); //右移一位 0111 ... 1111
	return 0; 
}

在这里插入图片描述
未完,代结~~。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值