目录
2 输入一个整数 n ,输出该数32位二进制表示中1的个数。
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");
}
}
}