操作符(一)(算数操作符,位移操作符,位操作符)

1.算术操作符

+  -  *  /  %

· 使用方法:
(1)%操作符的操作数必须为整数,其余几个操作符可以作用于整数也可以作用于浮点数。
(2)/操作符如果两个操作数都是整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
(3)%模除运算是取整之后的余数,只能操作整数,但对于负数来讲算出来的结果仍为对应的正数的模。

2.位移操作符

<<   左移操作符
>>   右移操作符

· 使用方法

(1) <<    左移操作符(高位丢掉,低位补0):

       将一个数的二进制编码向左移动,高位溢出的舍弃,低位补零

eg:将1左移1位

在这里插入图片描述

#include<stdio.h>
int main()
{
    
    
	int a = 1;
	printf("%d\n", a << 1);
	return 0;
}

在这里插入图片描述

(2) >> 右移操作符:

a.逻辑移位:左边补零,右边丢掉
b.算数运算符:左边补符号位,右边丢弃

eg1:将1右移一位

在这里插入图片描述

#include<stdio.h>
int main()
{
    
    
	int a = 1;
	printf("%d\n", a >> 1);
	return 0;
}

在这里插入图片描述

eg2:将-1右移一位

在这里插入图片描述

#include<stdio.h>
int main()
{
    
    
	int a = -1;
	printf("%d\n", a >> 1);
	return 0;
}

在这里插入图片描述

注: 位移运算符不要移动负数位,这个是未定义的
error eg:

printf("%d\n",num >> -1); //error

3.位操作符

注: 它们的操作数必须是整数

&   //按位与   同1为1,有0为0
|   //按位或   同0为0,有1为1
^   //按位异或 相同为0,相异为1

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

#include<stdio.h>
int main()
{
    
    
	int a = 22,b = 88;
	a = a ^ b;
	b = a ^ b;   //a ^ b ^ b = a 
	a = a ^ b;   //a ^ b ^ a = b
	printf("a=%d b=%d\n", a, b);
	return 0;
}

在这里插入图片描述

eg2:求一个整数储存在内存中的二进制中1的个数

方法一:使用按位与判断是否为1

#include<stdio.h>
int CountBitNum(unsigned int x)
{
    
    
	int count = 0;
	for (int i = 1; i <= 32; i++)
	{
    
    
		if ((x & 1) == 1)
	{
    
    
		count += 1;
	}
		x >>= 1;
	}
	return count;
}
int main()
{
    
    
	printf("%d\n", CountBitNum(0xFFFFFFFF));
	printf("%d\n", CountBitNum(1));
	printf("%d\n", CountBitNum(123));
	return 0;
}

在这里插入图片描述
方法2:使用%判断是否为1

#include<stdio.h>
int CountBitNum(unsigned int x)
{
    
    
	int count = 0;     //计数
	for (int i = 0; i < 32; ++i)   //控制循环的次数
	{
    
    
		if (x % 2 == 1)
		{
    
    
			count += 1;
		}
		x >>= 1;      //右移一位再赋值给x继续循环
	}
	return count;
}
int main()
{
    
    
	printf("%d\n", CountBitNum(0xFFFFFFFF));
	printf("%d\n", CountBitNum(1));
	printf("%d\n", CountBitNum(123));
	return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_50886514/article/details/110941901