ASSERT与CONST函数使用
assert函数为断言函数,当满足一定条件的时候起警示的作用,用来帮助判断程序是否出现问题,const函数的更多的作用是防止程序出现bug或者防止程序按照错误方向进行,比如要复制一个字符串给另外一个,我们来看看这两个函数的作用是怎么样的
//手工实现strcpy函数
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* x,const char* y)
{
assert(x != NULL);
assert(y != NULL);
char* ret = x;
while (*x++ = *y++)
{
;
}
return ret;
}
int main()
{
char a[] = { "xxxxxxx" };
char b[] = { "strcpy" };
printf("%s", my_strcpy(a, b));
return 0;
}
其中assert在此段代码的作用是防止数组里面传递的参数为空值,const防止要赋值的参数和赋值的参数前后顺序搞反
移位操作符求二进制不同位数
通过右移位操作符与自己输入的数进行对比,我们可以得到我们输入数字对应不同的位数,有两种方法,一种是逐次位与,当然这种方法明显不够效率高,我们选用的方法是先对两个数进行异或,再对其数字中含1的多少进行计算得出结果
//求两个数二进制不同的位数
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int bit_diff_count(int a, int b)
{
int count = 0;
int c = a ^ b;
int i;
for (i = 1; i < 32; i++)
{
c >> i;
if (c % 2 != 0)
{
count++;
}
}
return count;
}
int main()
{
int a;
int b;
scanf("%d", &a);
scanf("%d", &b);
printf("位数不同的个数为:%d\n",bit_diff_count(a, b));
}
打印二进制数奇数位和偶数位
打印奇数位和偶数位可以写两个循环,让其内的循环数每次都加2即可,这里我们采用的方法是对其奇数位偶数位为1的位赋值给一个新的变量,然后再逐次打印,代码如下:
//打印二进制的奇数位和偶数位
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
void print_bit(int x)
{
int i;
for (i = 31; i>=0; i--)
{
printf("%d",(x >> i) % 2);
}
printf("\n");
}
int main()
{
int a;
scanf("%d", &a);
int odd = 0;
int even = 0;
int i;
for (i = 0; pow(2, i) < a; i++)
{
if ((i+1) % 2 == 1)//奇数情况
{
odd = odd + ((a >> i) % 2) * pow(2, i);
}
else//偶数情况
{
even = even + ((a >> i) % 2) * pow(2, i);
}
}
print_bit(a);
print_bit(odd);
print_bit(even);
return 0;
}