操作符重点

本文介绍了C语言中的位运算符如左移、右移、按位与、或、异或以及取反,并展示了如何利用这些操作进行整数交换,同时提供了计算整数中1的个数和判断2的幂的方法。还讨论了操作符的优先级问题。
摘要由CSDN通过智能技术生成
  • 简介

  • 移位操作符   

    • <<:左移操作符

                        移动的是二进制的数,即存储在计算机内部的数的补码

                        移动之后再右边补零

              >>:右移操作符

                        同左移操作符

                        移动之后补的数分两种情况:

                                                                        (1).逻辑右移:移动后左边补1

                                                                        (2).算术右移:移动后左边补原符号位

位操作符:

 (1).&:按位与

               两个数的补码的对应位都为1才为1,有0即为0

 (2).|: 按位或

               两个数的补码的对应位上有1则为1,全0才为0

(3).^: 按位异或

               两个数的补码的对应位上相同则为0,不同则为1

               a^a==0  a^0==a

(4).~: 按位取反

              该数的补码取反,包括符号位

               ~x=-(x+1)      

  • 应用

  • 不能创建临时变量(第三个变量),实现两个数的交换。

int main()
{
	int a = 3;
	int b = 5;
	//方法一
	printf("a=%d,b=%d", a, b);
	a = a + b;
	b = a - b;
	a = a - b;
	printf("\na=%d,b=%d", a, b);
	//但是会可能会出现数的大小超过整形大小的情况
	//所以
	//方法二:使用按位异或来解决
	a = a ^ b;
	b = a ^ b;
	//b=a^b^b=a^0=a
	a = a ^ b;
	//a=a^b^a=b
	printf("\na=%d,b=%d", a, b);

	return 0;
}

编写代码实现:求⼀个整数存储在内存中的⼆进制中1的个数。

方法一
int main()
{
	int n;
	while (scanf("%d", &n) != EOF)
	{
		int count = 0;
		while (n != 0)
		{
			if (n % 2 == 1)
			{
				count++;
			}
			n = n / 2;
		}
		printf("%d\n", count);
	}
	return 0;
}


方法二
int main()
{
	int n;
	while (scanf("%d", &n) != EOF)
	{
		int count = 0;
		for (int i = 0;i < 32;i++)
		{
			if ((n >> i) & 1)
				count++;
		}
		printf("%d\n", count);
	}
	return 0;
}

方法三
扩展一个算法:n=n&(n-1)
该算法的作用是去掉该数二进制位上最右边的1

int main()
{
	int n;
	scanf("%d", &n);
	int count = 0;
	while (n != 0)
	{
		n = n & (n - 1);
		count++;
	}
	printf("%d\n", count);
	return 0;
}

提问:如何判断一个数是否为2的n次方数

思路一:可以看该数的二进制里有几个1,只有一个1的是

就直接:if(n=n&(n-1)==0)

二进制位置1或者置0

int main()
{
	int n = 13;
	//把第5位改成1
	n |= (1 << 4);
	printf("%d\n", n);
	//改回来
	n &= (~(1 << 4));
	printf("%d\n", n);
	return 0;
}

  • 优先级

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值