操作符详解例题:移位操作符,按位与,按位异或

1.不创建临时变量交换两数的值

int main()
{
	int a = 0;
	int b = 1;
	int c = 0;
    a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("%d %d", a,b);
	return 0;
}
  • 这里用到了按位异或(^)操作符,按位异或操作符的法则为相同则0,不同为1,例如:001与111进行按位异或的结果为110。
    在这里插入图片描述
  • 介绍完异或的概念我们就可以剖析上述的代码:首先我们可以发现异或有三个性质:1.由于a和a本身每一位都相同,所以按位异或后结果每位都是0,因此 a ^ a = 0 2. 由于0的二进制表示每一位都是0,a中为1的位置与0异或后依然为1,因此 0 ^ a = a 3. 异或满足交换律,a ^ b = b ^ a
    这样的三个性质可以用到上述代码中:
    在这里插入图片描述
  • 这样一来a和b就通过按位异或巧妙的进行了交换。

2.返回二进制数中1的个数

//思想:用1(1自身左移运算,其实后来就不是1了)和n的每位进行位与,来判断1的个数
int NumberOf1(int n) 
{
    int count = 0;
    int flag = 1;
    while (flag != 0) 
    {
        if ((n & flag) != 0)
         {
            count++;
        }
        flag = flag << 1;
    }
    return count;
}

int main()
{
    int n = 0;
    scanf("%d", &n);
    int ret = NumberOf1(n);
    printf("%d", ret);
    return 0;
}
  • 这道题用到了左位移操作符(<<)和按位与(&)操作符,左位移操作符的原则是这样的:左边丢弃,右边补0。如下操作:
    在这里插入图片描述
  • 按位与操作符的原则为:有0则0,同1为1。如下操作:
    在这里插入图片描述
  • 接下来剖析上述的代码,该题的思想为:用flag=1与输入的数字进行按位与操作,再对1进行左位移操作,如此循环,直到flag变为0。如下图:请添加图片描述

3.两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?

int Different(int a, int b)
{
        int Temp = 0;
        int count = 0;
        Temp = a ^ b;
		for (int i = 0; i <= 32; i++)
		{
			if (Temp & 1 != 0)
			{
				count++;
			}
			Temp = Temp >> 1;
		}
		return count;
}

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int ret = Different(a, b);
	printf("%d", ret);
	return 0;
}
  • 这道题目就综合运用了按位与按位异或右位移操作符。其中右移操作符的原则分为两种的:1 .算数右移:右边丢弃,左边补0 2. 逻辑右移:右边丢弃,左边补原来的符号位当然我们通常遇到的都是算数右移。
  • 此题的思想是让需要比较的两个数进行按位异或操作,这样一来,两数相同的位置异或的结果就为1。如下图:
    在这里插入图片描述
  • 接下来我们目标就很明确了,直接将结果中1的个数数出来便可以得知两数相同的位数。我们可以运用第二题中的办法,利用对1的按位与操作:将Temp与1进行按位与,再将Temp进行右位移操作,循环32次,因为一个整形变量的二进制表示为32位,相当于每次都用Temp的每一位与1的最后一位的1来比较,若结果不为0,则说明当次循环中,Temp的最后一位为1。如下图:
    在这里插入图片描述

总结

  • 通过上述三道题我们就熟悉掌握了按位与,移位操作符,按位异或的运用。
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值