C语言操作符例题

这篇具有很好参考价值的文章主要介绍了C语言操作符例题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒 个人主页
🥸🥸🥸 C语言
🐿️🐿️🐿️ C语言例题
🐣🐓🏀 python

例题一

下面代码的结果是:( )

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

A.a = 8 b = 23 c = 8
B.a = 9 b = 23 c = 8
C.a = 9 b = 25 c = 8
D.a = 9 b = 24 c = 8

答案 B

题目解析

c=++a是先执行++a,也就是a=a+1=6(注意这里是永久改变a的值),然后再执行c=a=6
b=++c,c++,++a,a++这里要注意对于b我们是只算b=++c,所以先执行c=c+1=7
b=c=7,然后再执行后面的c++,++a,a++(后面还是会执行的,只不过和b就没关系了),最终c=8.a=8
b+=a++ +c先变成b=b+a++ +c再执行a=a+1=9,b=b+a+c=7+8+8=23
最终a=9 b=23 c=8

例题二

不允许创建临时变量,交换两个整数的内容

题目解析

我们需要用到按位异或的方法去解决,按位异或在之前我有写到操作符详解上(非常详细)

#include <stdio.h>
int main()
{
	int a = 10;
    int b = 20;
    printf("交换前:a = %d b = %d\n", a,b);
    a = a^b;
    b = a^b;
    a = a^b;
    printf("交换后:a = %d b = %d\n", a,b);
	return 0;
}

按位异或就是相同为0不同为1,并且满足数学的交换规律
对于
一式a=a^b ,二式b=a^b, 三式a=a^b
我们将一式带入二式,b=a^ b^b,由于b ^b=1,那么最后b=a
而三式a=a^b其实就是a=a ^b ^a,其中a ^b是一式带入的,利用交换律我们就可以变成a=a ^a ^b,所以最后a=b

例题三

统计二进制中1的个数
代码解析:

方法一

*/
int NumberOf1(int n)
{
	int count = 0;
	while(n)
	{
		if(n%2==1)
			count++;
		n = n/2;//每次除2然后循环判断
	}
	return count;
}
/*

上述方法缺陷:进行了大量的取模以及除法运算,取模和除法运算的效率本来就比较低。
我们看看另外一个思路
一个int类型的数据,对应的二进制一共有32个比特位,可以采用位运算的方式一位一位的检测,具体如下

方法二


*/
int NumberOf1(unsigned int n)
{
	int count = 0;
	int i = 0;
	for(i=0; i<32; i++)
	{
		if(((n>>i)&1) == 1)
			count++;
	}
	return count;
}

int NumberOf1(int n ) {
    int j=0;
    for(int i=1;i<=32;i++)
    {
        if(n%2)//如果n%2为1就代表个位是1(这里不用判断十位百位)
        {
            n=n>>1;
            j++;
        }
        else(如果个位是0就直接右移)
            n=n>>1;
    }
    printf("%d",j);
    return j;
}

/*
  优点:用位操作代替取模和除法运算,效率稍微比较高
  缺陷:不论是什么数据,循环都要执行32次
  

方法三

思路:采用相邻的两个数据进行按位与运算
举例:‬
第一次循环:n=9999  
n=n&(n-1)=9999&9998=9998
(10 0111 0000 1111)
(10 0111 0000 1110) 
=(10 0111 0000 1110) 
第二次循环:n=9998 
 n=n&(n-1)=9998&9997= 9996
 (10 0111 0000 1110) 
 (10 0111 0000 1101) 
 =(10 0111 0000 1100) 
第三次循环:n=9996 
n=n&(n-1)=9996&9995= 9992
(10 0111 0000 1100) 
(10 0111 0000 1011) 
=(10 0111 0000 1000) 
第四次循环:n=9992   
n=n&(n-1)=9992&9991= 9984
(10 0111 0000 1000) 
(10 0111 0000 0111)
=(10 0111 0000 0000)
第五次循环:n=9984
n=n&(n-1)=9984&9983= 9728
(10 0111 0000 0000)
(10 0110 1111 1111)
=(10 0110 0000 0000)
第六次循环:n=9728   
n=n&(n-1)=9728&9727= 9216
(10 0110 0000 0000)
(10 0101 1111 1111)
=(10 0100 0000 0000)
第七次循环:n=9216   
n=n&(n-1)=9216&9215= 8192
(10 0100 0000 0000)
(10 0011 1111 1111)
=(10 0000 0000 0000)
第八次循环:n=8192   
n=n&(n-1)=8192&8191= 0
(10 0000 0000 0000)
(01 1111 1111 1111)
=(00 0000 0000 0000)


可以观察到:此种方式,数据的二进制比特位中有几个1,循环就循环几次
而且中间采用了位运算,处理起来比较高效
*/
int NumberOf1(int n)
{
	int count = 0;
	while(n)
	{
		n = n&(n-1);
		count++;
	}
	return count;
}

例题四

打印整数二进制的奇数位和偶数位
代码解析:

/*
思路:
1. 提取所有的奇数位,如果该位是1,输出1,是0则输出0
2. 以同样的方式提取偶数位置


 检测num中某一位是0还是1的方式:
   1. 将num向右移动i位
   2. 将移完位之后的结果与1按位与,如果:
      结果是0,则第i个比特位是0
      结果是非0,则第i个比特位是1
*/
void Printbit(int num)
{
	for(int i=31; i>=1; i-=2)
	{
		printf("%d ", (num>>i)&1);
	}
	printf("\n");
    
	for(int i=30; i>=0; i-=2)
	{
		printf("%d ", (num>>i)&1);
	}
	printf("\n");
}

例题五

求两个数二进制中不同位的个数文章来源地址https://www.toymoban.com/news/detail-756237.html

#include <stdio.h>

int main() {
    int a, b,sum=0;
 scanf("%d %d",&a,&b);
 for(int i=0;i<32;i++)
 {
  int c=a>>i; 
  int d=b>>i;
  if((c&1)==(d&1))判断个位是否相同
  ;
  else
   sum++;

 }
 printf("%d",sum);
    return 0;
}
/*
思路:
1. 先将m和n进行按位异或,此时m和n相同的二进制比特位清零,不同的二进制比特位为1
2. 统计异或完成后结果的二进制比特位中有多少个1即可
*/
#include <stdio.h>
int calc_diff_bit(int m, int n)
{
	int tmp = m^n;//找出相同的位
	int count = 0;
	while(tmp)
	{
		tmp = tmp&(tmp-1);//和上一题的方法三相同
		count++;
	}
	return count;
}
int main()
{
 int m,n;
 while(scanf("%d %d", &m, &n) == 2)
 {
     printf("%d\n", calc_diff_bit(m, n));
 }
 return 0;
}

到了这里,关于C语言操作符例题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • <C语言> 操作符

    加法(+):用于将两个操作数相加。 减法(-):用于将第一个操作数减去第二个操作数。 乘法(*):用于将两个操作数相乘。 除法(/):用于将第一个操作数除以第二个操作数。 取模(%):用于求两个操作数相除的余数。 乘法、除法和取模具有相同的优先级,高于加法

    2024年02月12日
    浏览(55)
  • 【C语言】操作符

    算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号操作符 下标引用、函数调用和结构成员操作符 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只

    2024年01月16日
    浏览(53)
  • C语言:“~”操作符详解

    ~:含义及用法举例 文章目录 前言 一、“~”是什么? 二、原码、反码及补码 1.简介 2.用法举例 ①正整数 ②负整数 ③零 三、“~”操作符 1.简介 2.用法举例 ①正整数 ②负整数 ③零 本文在简单介绍原码反码补码的基础上,介绍“~”操作符的用法。 ~:一种单目操作符,即对

    2024年02月10日
    浏览(53)
  • C语言---操作符详解

    算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号操作符 下标引用、函数调用和结构成员。 移位操作符,移动的是二进制位。 警告:对于移位运算符,不要移动负位数,这个是标准定义的。 3.1.1、原码、反码、补码介绍 整数

    2024年02月07日
    浏览(41)
  • 【C语言】操作符详解

    👦个人主页:Weraphael ✍🏻作者简介:目前正在回炉重造C语言(2023暑假) ✈️专栏:【C语言航路】 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍 算术操作符 位移操作符 位操作符 赋值操作符 单目操作符 关

    2024年02月16日
    浏览(44)
  • C语言——操作符详解

    哈喽,大家好,今天我们来学习C语言中的各中操作符。 目录 1.操作符的分类 2.算数操作符 整数的二进制表示 3.位移操作符 3.1左移操作符 3.2右移操作符 4.位操作符 5.赋值操作符 6.单目操作符 6.1 单目操作符介绍 ~ 的用法: 6.2 sizeof 和 数组 7.关系操作符 8.逻辑操作符 9. 条件操

    2024年02月05日
    浏览(51)
  • C语言初级<操作符>

    C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。 本篇文章是基于C语言,对入门小知识操作符的讲解,展

    2024年02月12日
    浏览(40)
  • 【C语言】操作符----详解

    💓博客主页:江池俊的博客 ⏩收录专栏:C语言初阶之路 👉其他专栏:数据结构探索 💻代码仓库:江池俊的代码仓库 🍁 如果觉得博主的文章还不错的话,请点赞👍收藏🌟 三连支持一下博主💞 目录 操作符分类:  💨 算术操作符  💨 移位操作符  原码、反码、补码

    2024年02月14日
    浏览(40)
  • c语言---操作符(详解)

    算术操作符: + 、- 、*、/ 、% 移位操作符: 位操作符: | ^ ` 赋值操作符: = 、+= 、 -= 、 = 、 /= 、%= 、= 、= 、= 、|= 、^= 单⽬操作符: !、++、–、、 、+、-、~ 、sizeof、(类型) 关系操作符: 、= 、 、= 、 == 、 != 逻辑操作符: 、|| 条件操作符: ? : 逗号表达式: , 下标引⽤: [

    2024年02月22日
    浏览(47)
  • c语言操作符(下)

    目录 ​编辑 逗号表达式 下标访问[] 函数调⽤()  sizeof 结构成员访问操作符 结构体 结构体声明 直接访问  .成员名 间接访问   结构体指针-成员名 exp1, exp2, exp3, …expN 运算规则 :从左向右依次执⾏。整个表达式的结果是 最后⼀个表达式 的结果。 如图c的值为逗号表达式中

    2024年02月19日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包