操作符及其详解

算数操作符
算数操作符包括以下几种

    •  *    /        %
      

需要特别注意的是
1.除了%操作符之外,其他操作符都可以用于整形和浮点型的运算.
2.当执行/的操作符的运算时,两边的都为整形的时候执行的为整形的运算,但是只要存在浮点数执行的就是浮点数的运算
但是怎样输出又是另外一回事,但是我们需要知道的是,只要除号的两端只要存在浮点数,执行的就是浮点型的运算
3.而至于取余符号,%我们可以了解到的是,我们必须要求的是,%两端的数字必须为整数,这个符号执行之后的结果就是两个整数取余之后的结果
我们知道对于除法运算,除数是不能为0的,此处编译时是正常的,但是运行时会报错
此处我们提出一个猜想,对于%这个符号,它的右边是否可以为0呐.
在这里插入图片描述
我们执行代码之后可以发现,这种操作方式是无法运行程序的,所以我们得出结论
对于求模运算,运算符号的右边是不能为0的
移位运算符
移位运算符包括两种
<< 这种称之为左移运算符,
>> 这种称之为右移运算符
两种运算符的区分方式就是根据运算符的尖端来进行判断,如果尖端朝向左边,我们称之为左移运算符
如果尖端朝向了右边,我们称之为右移运算符
关于移位运算符的使用
#include<stdio.h>
#include<stdlib.h>
int main()
{
int num = 4;
//<<后面跟上要移动的位数,比如下面我们要将num左移一位
//我们的书写方式就是num<<1
num = num << 1;
printf("%d", num);
system(“pause”);
return 0;
}
输出结果如下:
在这里插入图片描述
关于输出结果的分析:
我们可以看到输出结果为8,为什么呐,因为在计算机中数字都是以二进制位来进行表示的,左移一位就相当于2
所以: 4------->0100
那么左移一位的结果就为1000------>8
同理右移运算符的操作方式也是相同的
特别注意
对于移位操作符,是不能对负数进行操作的,不然编译器是会报错的
这个标准是未定义的.
//当移位操作符移动的位数为负数位时
#include<stdio.h>
#include<stdlib.h>
int main()
{
int num = 10;
num = num >> -1;
printf("%d", num);
system(“pause”);
return 0;
}
但是对于左移0位,和右移0位这种情况是可以进行操作的,只不过数字是不发生变化的
注意
在cpu中移位操作的效率是远远高于除法操作的效率的,所以我们可以看到,在有些的代码中,当要执行除2的运算时,极有可能写为右移一位这种形式,这种写法是结合了cpu的操作效率来书写的代码,大大提高了代码的操作效率
但是,代码的可读性有所下降
位操作
位操作包括三种
& 与
| 或
^ 异或
注意:它们的执行中必须为整数,因为是在二进制的情况之下进行执行的
按位与(&)
其操作规律为全1为1,有0为0
比如以下代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a = 1;
int b = 2;
printf("%d", a&b);
system(“pause”);
return 0;
}
对于a我们可以转化为 1---->0001
对于b我们可以转化为2----->0010
按照按位与的结果应该为—>0000
我们可以看到程序的输出结果为
在这里插入图片描述
与我们描述的相同
按位或(|)
其运算规律为 有1为1,全0为0
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a = 1;
int b = 2;
printf("%d", a | b);
system(“pause”);
return 0;
}
我们来分析这段代码
我们可以将a看做 1------>0001
我们可以将b看做2------->0010
按位与运算结束后的结果为—>0011
转化为十进制之后的结果就为3
在这里插入图片描述
代码执行之后带结果 我们可以看到就为3
**按位异或(
)**
按位异或的执行规律为相同为0,不同为1
我们来看以下的代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a = 1;
int b = 2;
printf("%d", a ^ b);
system(“pause”);
return 0;
}
和上面的代码一样,十进制的数在计算机中也要转化为二进制进行计算
a-------->0001
b-------->0010
那么按位异或之后的结果就为0011---->3
执行程序
在这里插入图片描述
对三种位运算的运算规律进行总结
按位与(&):全1为1,有0为0
按位或(|):有1 为1,全0为0
按位异或(^):相同为0,不同为1
再次强调,位运算都是针对于整数而言,在运算时转化为二进制进行运算
//求一个数字中二进制1的个数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int Ppp(int n)
{
int count = 0;
while (n)
{
//要求这个数二进制1的个数就是当这个数拿2求模为1时
if (n % 2 == 1)
{
count++;
}
//然后右移一位,继续进行判断
n = n >> 1;
}
return count;
}
int main()
{
int n = 10;
printf("%d", Ppp(n));
system(“pause”);
return 0;
}
执行的结果如下
在这里插入图片描述
当我们传入的值为一个负数的时候,会发生什么样的情况那
因为负数模一个数的结果还为负数,所以这串代码并不能执行负数这种情况
以上方法,只能实现判断一个正数二进制存在几个1,不能判断负数
下面的方法,既可以判断正数也可以判断负数二进制中1的个数
//方法2,求一个数字中二进制1 的个数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int Ppp(int n)
{
//创建一个Ppp()函数来判断二进制1的个数
int count = 0;
//此处创建一个for循环,因为n是一个Int型变量,它的最大值也不会超过32位,所以写出这个for循环
for (int i = 0; i <32; i++)
{
//此处的判断条件是本程序的关键
//需要使用到按位运算中的与(&)运算
//然后我每次让i左移一位,判断其与n进行按位与运算的结果是否不为0
//若不为0,就count++,这样我们就求出n二进制下每一位上1的个数
if (n & (1<<i))
{
count++;
}
}
return count;
}
int main()
{
int n = 0;
printf(“请您输入您要求的数字:”);
scanf("%d", &n);
//此处调用一下Ppp()函数来进行判断
int ret = Ppp(n);
printf(“ret=%d”, ret);
system(“pause”);
return 0;
}
对于这段代码的分析
这段代码虽然支持正数和负数的运算,但是逻辑上还是较为复杂,我们来梳理一下
当我们传入的参数为10时,计算机会将这个数字自动转化为二进制------>1010
那么我们规定的i循环中,i的初值为0------>0000
然后我们对i开始进行循环,每次循环都对i加1
然后我们判断的就是i每次+1之后的值1010进行按位与运算之后的结果是否为0
我们知道,按位与的计算规律为全1为1,有0位0这种情况之下,我们就可以对1010的每一位进行遍历
然后当有1时,进行count++,最后求出其中二进制下1的个数
注意
此处使用移位运算符时需要区分i<<1 1<<i
1<<i 表示的是将1左移i位
i<<1 表示的是将i左移1位,这种写法因为每次移动的位数只有1位,而且i是递增的,会使得i新加上的数值与1010反复进行按位与(&)运算,最后有一大部分进行了重复计算
方法三
//方法3
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int Ppp(int n)
{
int count = 0;
while (n)
{
n = n & (n - 1);
count++;
}
return count;
}
int main()
{
int n = 0;
printf(“请输入您要计算的数字:”);
scanf("%d", n);
int ret = Ppp(n);
printf("%d", ret);
system(“pause”);
return 0;
}
这种写法虽然代码较为简单,但是不便于理解
所以,不推荐

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值