初识结构体;操作符类型题目;

本文介绍了C语言中结构体的使用,包括结构体的声明、变量创建、嵌套结构体以及.操作符和->操作符的区别。还展示了如何通过不同的方法计算数值中1的个数,判断是否为2的幂次方,以及求两个数中不同位的个数。
摘要由CSDN通过智能技术生成

初识结构体;

创建结构体类型;

1.结构体是一个不一定相同类型元素的集合;

2.声明里面的内容;后面如果加了变量名,表示创建了该类型的变量;

3.代码:

struct student {
	char name[10];
	int age;
	double height;
	char sex[5];
} s2,s3,s4;

结构体嵌套及访问;

1.先创建一个结构体,再创建一个结构体,在里面嵌套上一开始创建的结构体,并进行初始化;

2.运用 . 操作符进行一层或多层访问;

3.代码:

struct s
{
	int* dizhi;
	int  length;
};
struct s bin = { NULL,20 };

struct student {
	char name[10];
	int age;
	int height;
	char sex[5];
	struct s bin;
};
//
int main()
{
	
	struct student snake = { "san",18,178,"male",{NULL,20} };
	printf("%s %d %d %s %p %d\n", snake.name, snake.age, snake.height,snake.sex, snake.bin.dizhi,snake.bin.length );
	return 0;// .可以多次访问;
}

4.运行结果;

 ‘.’ 操作符和->操作符;

1. '.'操作符前面是变量;->操作符前面是指针;

2.代码:

struct student {
	char name[10];
	int age;
	int height;
	char sex[5];
};
int main()//在c语言中没有对结构体类型进行typedef,不能省略关键字;
{
	struct student s1 = { "zhang",19,1.80,"fem" };//这是的按照结构体定义顺序来写;
	struct student s2 = { .age=18,.height=1.79,.sex="cant",.name="xiba"};//不用按照结构体定义顺序;
	printf("%lf %d %s %s\n", s1.height, s1.age, s1.name, s1.sex);//不用按照顺序打印;
	printf("%s %d %lf %s\n", (&s1)->name, (&s1)->age, (&s1)->height, (&s1)->sex);
	//这是访问结构体的两种方式;
	return 0;
}

3.运行结果;

操作符类型题目;

得到一个数中1的个数;

法一:按位与1;

1.利用移位操作符和与操作符来判断最后一位是不是1,并使用计数器来记录;

2.代码:

#include<stdio.h>
int cunt1(int n)
按位与1
{
	int i = 0;
	int count = 0;
	for (i = 0; i < 32; i++)
	{
		int x = 1 & (n>>i);
		if (1 == x)
		{
			count++;
		}
	}
	return count;
	
}

法二:模2除2;

1.先模2,只要是奇数,最后一位肯定是1,计数器加1;再除2,去掉最后一位,相当于向前移;

2.如此循环,一直到n=0,返回计数器内容;

3.代码:

int cunt1(unsigned int n)
{
	int count = 0;
	while (n)
	{
		if (1 == n % 2)//只要是奇数,最后一位肯定是1
		{
			count++;//负数也当无符号数来处理;
		}
		n = n / 2;//去掉最后一位,相当于往前移;
	}
	return count;
}

法三:n&(n-1);

1.n&(n-1)会让最右边的1去掉,直到n变成0,去掉1的个数就是这个数1的个数;

2.代码:

#include<stdio.h>
int cunt1(int n)//有几个1数几次,效率最快;
{
	int count = 0;
	while (n)
	{
		
		
			n = n & (n - 1);
			count++;
	
	}
	return count;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int back = cunt1(n);
	printf("%d个1\n", back);
	return 0;
}

3.运行结果;

判断一个数是不是2的幂次方;

1.如果数是2的幂次方那么他的二进制只有1位;

2.n&(n-1)会去掉最右边的1,如果是二的幂次方,则n变成0;

3.代码:

#include<stdio.h>
void istwo(int n)
{
	if (n <= 0)
	{
		printf("%d不是2的幂次方\n", n);
    }
	else 
	{
		int z = n & (n - 1);
		if (0 == z)
		{
			printf("%d是2的幂次方\n", n);
		}
		else
		{
			printf("%d不是2的幂次方\n", n);
		}
	}
	
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	istwo(n);
	return 0;
}

4.运行结果;

求两个数中不同位的个数;

1.先求两个数的异或;在算出异或结果里1的个数;

2.代码:

#include<stdio.h>
int count(int x)
{
	int count = 0;
	while (x)
	{
		x = x & (x - 1);
		count++;//可以设置断点条件使得条件成立才触发断点
	}
	return count;

}
int main()
{
	int m = 0;
	int n = 0;
	scanf("%d%d", &m, &n);
	int ret = m ^ n;
	int back=count(ret);
	printf("%d个不同位\n", back);
	return 0;
}

3.运行结果;

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值