C语言刷题(1)

个人主页点我进入主页

专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶

C语言刷题

欢迎大家点赞,评论,收藏。

一起努力,一起奔赴大厂。

目录

1.选择

2.编程

2.1题干

2.2分析题干

 2.3代码(接口函数)

2.4分析代码

2.5运行


         学习了很多C语言的知识,今天主要的是一些有意思的题目,接下来就让我们感受一下其中的乐趣吧。

1.选择

1.假设编译器规定 int 和 short 类型长度分别为32位和16位,若有下列C语言语句,则 y 的机器数为( )

unsigned short x = 65530;
unsigned int y = x;

 A: 0000 7FFA B: 0000 FFFA C: FFFF 7FFA D: FFFF FFFA

         我们先看选项都是16进制数据,所以我们需要对unsigned short x=65530进行转化,它是10进制类型,我们先转化为二进制类型,由于short占用16位为故得到它的二进制序列为1111111111111010,我们再转化为16进制,我们知道二进制转化为16进制是4位一转化1111对应F,1010对应A.故我们得到它的十六进制序列为FFFA,我们看unsigned int y = x,是将无符号短整型转化为无符号整形,故需要进行整型提升,整型提升可以看https://blog.csdn.net/Infernal_Puppet/article/details/132466544,因为是无符号短整型,整型提升为无符号整形补0,故为0000FFFA,故选择B。

2. 如果 x=2014,下面函数的返回值是 ( )

int fun(unsigned int x)
{
	int n = 0;
	while (x + 1)
	{
		n++;
		x = x | (x + 1);
	}
	return n;
}

        我们看到题干中主要有|符号,这是按位或主要作用是对二进制进行操作,将两个数的二进制序列有1为1,否则为0,详细可以点击https://blog.csdn.net/Infernal_Puppet/article/details/132098917icon-default.png?t=N7T8https://blog.csdn.net/Infernal_Puppet/article/details/132098917 ,我们先进行二进制转化,2014的二进制序列为00000000000000000000011111011110,先进行第一步2014|2015,2015的二进制序列为00000000000000000000011111011111,得到x=2015,二进制序列为00000000000000000000011111011111,再次进入循环,2015|2016,2016的二进制序列为00000000000000000000011111100000,得到x的二进制序列为00000000000000000000011111111111,x为2047,这样不断进行循环得到n为23.

2.编程

2.1题干

 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。详细题干可以点击不用加减乘除做加法_牛客题霸_牛客网 (nowcoder.com)  ,

2.2分析题干

        我们不能使用+-*/这几个操作符,但是需要得到两个整数的和,我们想其他的操作符,我们知道整数的加减是使用二进制进行操作的,我们就可以想到& | ^ >>  <<这五个操作符也是对二进制进行操作的,本题是使用& ^  <<这三个操作符进行的,想要了解这三个操作符可以点击C语言操作符详解_steventom的博客-CSDN博客 进行学习。

 2.3代码(接口函数)

int Add(int num1, int num2 ) {
    // write code here
    int temp;
    while(num2!=0)
    {
        temp=num1^num2;
        num2=(num1&num2)<<1;
        num1=temp;

    }
        return num1;
}

2.4分析代码

        在这里我们知道^是相同为0,不同为1,也就是找到不需要进位的序列;&是都为1才为1,否则为0,也就是找到需要进位的序列,再进行左移,然后num1=temp,num是不需要进位的,num2是需要进位的序列进位后的结果,再次进行循环,知道没有需要进位的也就是num2为0,此时、循环结束,num1也就是结果,完成了不用+-*/得到两数相加。

2.5运行

 我们看到结果为30.

        最后希望大家可以学到很多东西,坚持刷题,才能有所成长,点我主页一起学习更多知识,加油,还有不要忘了关注,点赞,评论,收藏呦,

猜你喜欢

转载自blog.csdn.net/Infernal_Puppet/article/details/132640210