网站 公众号信息化建设工作,网站营销学多久,wordpress 分页目录,2015网站设计风格这里写目录标题 例题一题目解析 例题二题目解析 例题三方法一方法二方法三 例题四例题五 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 #x1f412;#x1f412;#x1f412;
个人主页 #x1f978;#x1f978;#x1f978;
C语言 #x1f43f;️… 这里写目录标题 例题一题目解析 例题二题目解析 例题三方法一方法二方法三 例题四例题五 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 个人主页 C语言 ️️️
C语言例题 python 例题一
下面代码的结果是( )
#include stdio.h
int main()
{int a, b, c;a 5;c a;b c, c, a, a;b a c;printf(a %d b %d c %d\n:, a, b, c);return 0;
}A.a 8 b 23 c 8 B.a 9 b 23 c 8 C.a 9 b 25 c 8 D.a 9 b 24 c 8
答案 B
题目解析
ca是先执行a,也就是aa16(注意这里是永久改变a的值),然后再执行ca6 bc,c,a,a这里要注意对于b我们是只算bc,所以先执行cc17 bc7,然后再执行后面的c,a,a(后面还是会执行的,只不过和b就没关系了),最终c8.a8 ba c先变成bba c再执行aa19,bbac78823 最终a9 b23 c8
例题二
不允许创建临时变量交换两个整数的内容
题目解析
我们需要用到按位异或的方法去解决,按位异或在之前我有写到操作符详解上非常详细
#include stdio.h
int main()
{int a 10;int b 20;printf(交换前:a %d b %d\n, a,b);a a^b;b a^b;a a^b;printf(交换后:a %d b %d\n, a,b);return 0;
}按位异或就是相同为0不同为1,并且满足数学的交换规律 对于 一式aa^b ,二式ba^b, 三式aa^b 我们将一式带入二式,ba^ b^b,由于b ^b1,那么最后ba 而三式aa^b其实就是aa ^b ^a,其中a ^b是一式带入的,利用交换律我们就可以变成aa ^a ^b,所以最后ab
例题三
统计二进制中1的个数 代码解析:
方法一
*/
int NumberOf1(int n)
{int count 0;while(n){if(n%21)count;n n/2;//每次除2然后循环判断}return count;
}
/*上述方法缺陷进行了大量的取模以及除法运算取模和除法运算的效率本来就比较低。 我们看看另外一个思路 一个int类型的数据对应的二进制一共有32个比特位可以采用位运算的方式一位一位的检测具体如下
方法二 */
int NumberOf1(unsigned int n)
{int count 0;int i 0;for(i0; i32; i){if(((ni)1) 1)count;}return count;
}int NumberOf1(int n ) {int j0;for(int i1;i32;i){if(n%2)//如果n%2为1就代表个位是1(这里不用判断十位百位){nn1;j;}else(如果个位是0就直接右移)nn1;}printf(%d,j);return j;
}/*优点用位操作代替取模和除法运算效率稍微比较高缺陷不论是什么数据循环都要执行32次
方法三
思路采用相邻的两个数据进行按位与运算
举例
第一次循环n9999
nn(n-1)999999989998
(10 0111 0000 1111)
(10 0111 0000 1110)
(10 0111 0000 1110)
第二次循环n9998 nn(n-1)99989997 9996(10 0111 0000 1110) (10 0111 0000 1101) (10 0111 0000 1100)
第三次循环n9996
nn(n-1)99969995 9992
(10 0111 0000 1100)
(10 0111 0000 1011)
(10 0111 0000 1000)
第四次循环n9992
nn(n-1)99929991 9984
(10 0111 0000 1000)
(10 0111 0000 0111)
(10 0111 0000 0000)
第五次循环n9984
nn(n-1)99849983 9728
(10 0111 0000 0000)
(10 0110 1111 1111)
(10 0110 0000 0000)
第六次循环n9728
nn(n-1)97289727 9216
(10 0110 0000 0000)
(10 0101 1111 1111)
(10 0100 0000 0000)
第七次循环n9216
nn(n-1)92169215 8192
(10 0100 0000 0000)
(10 0011 1111 1111)
(10 0000 0000 0000)
第八次循环n8192
nn(n-1)81928191 0
(10 0000 0000 0000)
(01 1111 1111 1111)
(00 0000 0000 0000)可以观察到此种方式数据的二进制比特位中有几个1循环就循环几次
而且中间采用了位运算处理起来比较高效
*/
int NumberOf1(int n)
{int count 0;while(n){n n(n-1);count;}return count;
}例题四
打印整数二进制的奇数位和偶数位 代码解析:
/*
思路
1. 提取所有的奇数位如果该位是1输出1是0则输出0
2. 以同样的方式提取偶数位置检测num中某一位是0还是1的方式1. 将num向右移动i位2. 将移完位之后的结果与1按位与如果结果是0则第i个比特位是0结果是非0则第i个比特位是1
*/
void Printbit(int num)
{for(int i31; i1; i-2){printf(%d , (numi)1);}printf(\n);for(int i30; i0; i-2){printf(%d , (numi)1);}printf(\n);
}例题五
求两个数二进制中不同位的个数
#include stdio.hint main() {int a, b,sum0;scanf(%d %d,a,b);for(int i0;i32;i){int cai; int dbi;if((c1)(d1))判断个位是否相同;elsesum;}printf(%d,sum);return 0;
}/*
思路
1. 先将m和n进行按位异或此时m和n相同的二进制比特位清零不同的二进制比特位为1
2. 统计异或完成后结果的二进制比特位中有多少个1即可
*/
#include stdio.h
int calc_diff_bit(int m, int n)
{int tmp m^n;//找出相同的位int count 0;while(tmp){tmp tmp(tmp-1);//和上一题的方法三相同count;}return count;
}
int main()
{int m,n;while(scanf(%d %d, m, n) 2){printf(%d\n, calc_diff_bit(m, n));}return 0;
}