操作符习题

目录

1 知识点

2 输入一个整数 n ,输出该数32位二进制表示中1的个数。

3 求两个数二进制中不同位的个数

4 打印整数二进制的奇数位和偶数位

5 下面的代码结果是

6 判断整数奇偶性 (多组输入的场景)

7 判断是元音还是辅音(多组输入场景)


1 知识点

(1)b = ++c, c++, ++a, a++ // 逗号表达式的优先级最低,这里先算b=++c, b得到的是++c后的结果,b=++c 和后边的构成逗号表达式,依次从左向右计算的。

(2)全局变量 没有初始化的时候 会默认初始化为0。

(3)关于表达式求值,注意 要考虑 隐式类型转换、算数转换、操作符的优先级 结合性 求值顺序

2 输入一个整数 n ,输出该数32位二进制表示中1的个数。

其中负数用补码表示。要求:写一个函数返回参数二进制中 1 的个数。

代码1展示:(注意:这里是放在内存中补码的二进制中1的个数)

#include <stdio.h>
int count_number_of_1(unsigned int n)
{
	int count = 0;
	while (n)
	{
		if (n % 2 == 1)
		{
			count++;
			n = n / 2;
		}
	}
	return count;
}
int main()
{
	int a =-1;
	int ret = count_number_of_1(a);
	printf("%d", ret);
	return 0;
}

注意:函数里写的是unsigned int (无符号整型int)

代码解析:

7的二进制序列是00000000000000000000000000000111,当7%2=1,这个1就是二进制最后一位,7/2=3,这个3是7的二进制序列向右移动一位显示的数字,00000000000000000000000000000011。(这个思路,当一个十进制数字,要想知道每一位数字,我们一般都是先%10,再除以10 依此循环)

代码2展示:

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

int main()
{
	int a = -1;
	int ret = count_number_of_1(a);
	printf("%d", ret);
	return 0;
}

代码3展示:

#include <stdio.h>
int count_number_of_1(int n)
{
	int count = 0;
	while (n)
	{
		n = n & (n - 1);
		count++;
	}
	return count;
}

int main()
{
	int a = -1;
	int ret = count_number_of_1(a);
	printf("%d", ret);
	return 0;
}

代码理解:

m&(m-1)会把二进制序列从右面依次去掉一个1  ( 0111&0110=0110  0110&0101=0100)

(执行一次去掉一个1,执行多少次,就有多少个1)

(这个是最佳答案,有几个1,就循环几次.)

3 求两个数二进制中不同位的个数

两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同

代码1展示:

#include <stdio.h>
int count_diff_bit(int m, int n)
{
	int count = 0;
	int i = 0;
	for (i = 0; i < 32; i++)
	{
		if ((m & 1) != (n & 1))
		{
			count++;
		}
		m >>= 1;
		n >>= 1;
	}
	return count;
}

int main()
{
	int a = -1;
	int b = 1;
	int ret = count_diff_bit(a, b);
	printf("%d", ret);
	return 0;
}

代码2展示:

#include <stdio.h>
int count_diff_bit(int m, int n)
{
	int count = 0;
	int i = m ^ n;
	while (i)
	{
		i = i & (i - 1);
		count++;
	}
	return count;
}

int main()
{
	int a = -1;
	int b = 1;
	int ret = count_diff_bit(a, b);
	printf("%d", ret);
	return 0;
}

 异或 相同为0,不同为1.,结果又回到了求一个二进制数列1的个数。

4 打印整数二进制的奇数位和偶数位

获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列

#include <stdio.h>
void print(int m)
{
	int i = 0;
	for (i = 30; i >= 0; i -= 2)
	{
		printf("%d ", (m >> i) & 1);
	}

	printf("\n");
	for (i = 31; i >= 1; i -= 2)
	{
		printf("%d ", (m >> i) & 1);
	}
}

int main()
{
	int a = 5;
	scanf("%d", &a);
	print(a);
	return 0;
}

5 下面的代码结果是

#include <stdio.h>
int i;
int main()
{
    i--;
    if (i > sizeof(i))
    {
        printf(">\n");
    }
    else
    {
        printf("<\n");
    }
    return 0; 
}

A.>         B.<       C.不输出        D.程序有问题

 解析:

C语言中,0为假,非0即为真。全局变量,没有给初始值时,编译其会默认将其初始化为0。

i的初始值为0,i--结果-1,i为整形,sizeof(i)求i类型大小是4,按照此分析来看,结果应该选择B,但是sizeof的返回值类型实际为无符号整形,因此编译器会自动将左侧i自动转换为无符号整形的数据,-1对应的无符号整形是一个非常大的数字,超过4或者8,故实际应该选择A

sizeof 操作数 计算的结果类型是size_t 无符号整型unsigned int   在这道题中 int >unsigned int 首先应该把 int类型(进行隐式类型转换中的算数转换) 转换成 unsigned int 类型才可以 当-1 被认为是无符号整型的时候(-1的补码是32个1),原码 反码 补码都应该相同,那么-1的无符号整型显然很大,大于4,所以应该选A

6 判断整数奇偶性 (多组输入的场景)

从键盘任意输入一个整数(范围-231~231-1),编程判断它的奇偶性。      输入描述:多组输入,每行输入包括一个整数。   输出描述:针对每行输入,输出该数是奇数(Odd)还是偶(Even)。

代码展示:

#include <stdio.h>
int main()
{
	int a = 0;
	while ((scanf("%d", &a)) != EOF)
	{
		if (a % 2 == 0)
		{
			printf("Even\n");
		}
		else
		{
			printf("Odd\n");
		}
	}
	return 0;
}

scanf读取失败,就会返回EOF

7 判断是元音还是辅音(多组输入场景)

输入描述:

多组输入,每行输入一个字母。

输出描述:

针对每组输入,输出为一行,如果输入字母是元音(包括大小写),输出“Vowel”,如果输入字母是非元音,输出“Consonant”。

#include <stdio.h>
int main()
{
	char arr[] = { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' };
	char ch = 0;
	while ((scanf("%c", &ch) != EOF))
	{
		int i = 0;
		for (i = 0; i < 10; i++)
		{
			if (ch == arr[i])
			{
				printf("Vowel\n");
				break;
			}
		}
		if (i == 10)
		{
			printf("Consonant\n");
		}
		getchar();
	}
}

注意:

在键盘上获取ch类型的时候,会把\n也输入到,所以要用getchar()清理缓冲区

代码2展示:

#include <stdio.h>
int main()
{
	char arr[] = { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' };
	char ch = 0;
	while ((scanf("%c\n", &ch) != EOF))
	{
		int i = 0;
		for (i = 0; i < 10; i++)
		{
			if (ch == arr[i])
			{
				printf("Vowel\n");
				break;
			}
		}
		if (i == 10)
		{
			printf("Consonant\n");
		}
	}
}

代码3展示:

#include <stdio.h>
int main()
{
	char arr[] = { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' };
	char ch = 0;
	while ((scanf(" %c", &ch) != EOF))
	{
		int i = 0;
		for (i = 0; i < 10; i++)
		{
			if (ch == arr[i])
			{
				printf("Vowel\n");
				break;
			}
		}
		if (i == 10)
		{
			printf("Consonant\n");
		}
	}
}

猜你喜欢

转载自blog.csdn.net/m0_57388581/article/details/122870489