c++ || 位运算

文章目录

  • 位运算是把数字用二进制表示之后,对每一位上0或者1的运算。
  • 二进制是指数字的每一位都是0或1.

二进制运算

  • 与、或、异或
与(有0则0)或 (有1则1)异或(不同为1)
0&0=00l0=00^0=0
1&0=01l0=11^0=1
0&1=00l1=10^1=1
1&1=11l1=11^1=0
  • 左移、右移
  1. 左移m<<n表示把m左移n位,左移时,最左边n位被丢弃,同时在最右边 补上n个0
    0000 1010<<2 = 0010 1000
    1000 1010<<3 = 0101 0000
  2. 右移m>>n表示把m右移n位,右移时,最右边的n位被丢弃,最左边补什么需要分情况
    当数字原先是个正数,右移后左边补n个0(二进制以0开始)
    当数字原先是个负数,右移后左边补n个1(二进制以1开始)

    0000 1010>>2 = 0000 0010
    1000 1010>>3 = 1111 0001

例题: 二进制中1的个数

(1方法)整数二进制最右边一位是不是1,(整数与1做与运算判断是不是0)
在右移继续进行运算 -->会出现死循环
(2方法)不移动输入的数字n 而是通过移动左移1判断每一位是不是1
(3方法)把一个整数减去1,再和原整数做与运算,会把该整数最右边的1变为0
那么一个整数的二进制中有多少个1,则执行多少次操作

int NumberOf1_1(int  n)
{
	int count = 0;
	while (n)
	{
		if (n & 1) { count++; }
		n = n >> 1;
	}
	return count;
}
int NumberOf1_2(int n)
{
	int count = 0;
	int flag = 1;
	while (flag )  //循环次数等于整数二进制的位数
	{
		if (n & flag) { count++; }
		flag = flag << 1;
	}
	return count;
}
int NumberOf1_3(int n)
{
	int count = 0;
	while (n)
	{
		count++;
		n = (n - 1) & n;
	}
	return count;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值