1,表达式求值
2,写一个函数返回参数二进制中的1的个数
3,两个整数的二进制表达中,有多少个(bit)位不同
4,打印整数二进制的奇数位和偶数位
5,全局变量与局部变量默认值
6,打印X型图案
7,获得月份天数
8,模拟string函数
9,const修饰指针变量
1,表达式求值
#include<stdio.h>
int main() {
int a, b, c;
a = 5;
c = ++a;//c=6 a=6
b = ++c, c++, ++a, a++;//注意:有逗号表达式 c=8 b=7 a=8
b += a++ + c;//a=9 b=23
printf("a = %d b = %d c = %d\n", a, b, c);
//9 23 8
return 0;
}
2,写一个函数返回参数二进制中的1的个数
#include<stdio.h>
//写一个函数返回参数二进制中的1的个数
// 方法一
//int count_num_of_1(int n) {
// int count = 0;
// while (n) {
// if ((n%2)==1)
// {
// count++;
// }
// n /= 2;
// }
// return count;
//}
//注意 -1
//1000000000000000000000000000000000000000000001
//1111111111111111111111111111111111111111111110
//1111111111111111111111111111111111111111111111 -1的补码
//对上述代码做了一点修改
//int count_num_of_1(unsigned int n) {
// int count = 0;
// while (n) {
// if ((n % 2) == 1)
// {
// count++;
// }
// n /= 2;
// }
// return count;
//}
//方法二(效率不高,循环32次)
//int count_num_of_1(int n) {
// int i = 0;
// int count = 0;
// for ( i = 0; i < 32; i++)
// {
// if (((n>>i)&1)==1)
// {
// count++;
// }
// }
// return count;
//}
//方法三(不容易想,但是非常牛)
//n=15
//n=n&(n-1)
//1111 n
//1110 n-1
//1110 n
//1101 n-1
//1100 n
//1011 n-1
//1000 n
//0111 n-1
//0000 n
int count_num_of_1(int n) {
int count = 0;
while (n) {
n = n & (n - 1);
count++;
}
return count;
}
int main() {
int num = 0;
scanf("%d", &num);
int n = count_num_of_1(num);
printf("%d\n", n);
return 0;
}
3,两个整数的二进制表达中,有多少个(bit)位不同
#include<stdio.h>
//两个整数的二进制表达中,有多少个(bit)位不同
//方法一
//int count_diff_bit(int m,int n) {
// int count = 0;
// int i = 0;
// for ( i = 0; i < 32; i++)
// {
// if (((m>>i)&1)!=((n>>i)&1))
// {
// count++;
// }
// }
// return count;
//}
////方法二(异或操作符)
int count_diff_bit(int m, int n) {
int count = 0;
// ^ 异或操作符
//相同为0,相异为1
int ret = m ^ n;
//统计一下ret中的二进制位有几个
while (ret) {
ret = ret & (ret - 1);
count++;
}
return count;
}
int main() {
int m = 0;
int n = 0;
scanf("%d %d", &m, &n);
int ret = count_diff_bit(m, n);
printf("%d\n", ret);
return 0;
}
4,打印整数二进制的奇数位和偶数位
#include<stdio.h>
//打印整数二进制的奇数位和偶数位
//题目:获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二机制序列
//
//10
//00000000000000000000000000001010
int main() {
int i = 0;
int num = 0;
scanf("%d", &num);
//获取奇数位的数字
for ( i = 30; i >= 0; i-=2)
{
printf("%d ", (num >> i) & 1);
}
printf("\n");
//获取偶数位的数字
for ( i = 31; i >=1; i-=2)
{
printf("%d ", (num >> i) & 1);
}
return 0;
}
5,全局变量与局部变量默认值
#include<stdio.h>
//全局变量,静态变量都是放在静态区
//全局变量,静态变量不初始化的时候,默认会被初始化为0
//局部变量,是放在栈区的,不初始化,默认值是随机值
//int i;//全局变量 0
int main() {
i--;//-1
printf("%d\n", i);
//sizeof这个操作符计算返回的结果是size_t类型的,是无符号整型的
//1000000000000000000000000000000000000000001 -1
//1111111111111111111111111111111111111111110
//1111111111111111111111111111111111111111111 -1的补码,在内存中的存储形式,(也是无符号数)
if (i > sizeof(i)) //-1 > 4
{
//printf("%d\n", sizeof(i));
printf(">\n");
}
else
{
printf("<\n");
}
return 0;
}
6,打印X型图案
#include<stdio.h>
//打印X型图案
//描述:输入一个整数,表示输出的行数,也表示组成"X"的反斜线和正斜线的长度
//针对每行输入,输出用"*"组成的x型图案
//eg: * *
// * *
// *
// * *
// * *
int main() {
int n = 0;
while (scanf("%d",&n)==1) {
int i = 0;
int j = 0;
for ( i = 0; i < n; i++)
{
for (j = 0; j < n; j++) {
if (i==j)
{
printf("*");
}
else if (i+j==n-1)
{
printf("*");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
return 0;
}
7,获得月份天数
#include<stdio.h>
//获得月份天数
//输入年份和月份,计算这一年的这一月有多少天
int is_leap_year(int y) {
return (((y % 4 == 0) && (y % 100 != 0)) || ((y % 400) == 0));
}
int main() {
int y = 0;
int m = 0;
int d = 0;
int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
// 1 2 3 ...
while(scanf("%d%d",&y,&m)==2) {
int d = days[m];
if ( (is_leap_year(y)==1)&&(m==2))
{
d++;
}
printf("%d\n", d);
}
return 0;
}
8,模拟string函数
#include<stdio.h>
//模拟string函数
#include<string.h>
//void my_strcpy(char* dest, char* src) {
// while (*src!='\0') {
// *dest = *src;
// dest++;
// src++;
// }
// *dest = *src;
//}
//上述代码的改进版本
//#include<assert.h>
//void my_strcpy(char* dest, char* src) {
//
// //断言
// assert(src != NULL);
//
// while (*dest++ = *src++) {
// ;
//
// }
// }
//int main() {
// char arr1[20] = "xxxxxxxxxxxxxx";
// char arr2[] = "hello bit";
// //strcpy在拷贝字符串的时候,会把源字符串中的\0也拷贝进去
// my_strcpy(arr1, arr2);
// printf("%s\n", arr1);
// return 0;
//}
//上面代码的完美版本
//strcpy返回值是char* 是目标空间的地址
#include<assert.h>
char* my_strcpy(char* dest, char* src) {
char* ret = dest;
//断言
assert(src != NULL);
assert(dest != NULL);
while (*dest++ = *src++) {
;
}
return ret;
}
int main() {
char arr1[20] = "xxxxxxxxxxxxxx";
char arr2[] = "hello bit";
//strcpy在拷贝字符串的时候,会把源字符串中的\0也拷贝进去
//my_strcpy(arr1, arr2);
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
9,const修饰指针变量
#include<stdio.h>
int main() {
const int num = 10;//常变量
//const修饰指针变量
//1.const 放在*的左边
const int* p = #
//意思是:p指向的对象不能通过p来改变了,但是p变量本身的值是可以改变的
//2,const 放在*右边
//意思是:p指向的对象是可以通过p来改变的,但是不能修改p变量本身的值
int* const p = #
return 0;
}