no1.c
//编写一个函数,把二进制字符串转换为一个数值.例如,有下面语句:
//char * pbin = "01001001" ;
//那么把pbin作为参数传递给函数后,他应该返回一个int类型的值25;
# include <stdio.h>
# include <limits.h>
# include <string.h>
# include <stdlib.h>
# include <ctype.h>
# define SIZE 33
int get_bstr(char * st , int n);
char * del_space(char * st);
int btoi(char * st);
int main(void)
{
char binstr[SIZE];
int num ;
printf("请输入二进制数(输入空行退出)\n");
while (get_bstr(binstr , SIZE) && binstr[0])
{
num = btoi(del_space(binstr));
printf("%s 是十进制是 %d\n" , binstr , num);
printf("请输入下一个二进制数(输入空行退出)\n");
}
return 0 ;
}
//从标准输入里读取二进制字符串,给出字符串数组地址,和读取长度,读取n-1个二进制字符.自动添加'\0'
//返回成功读取的字符个数,读取失败返回0,遇到不是二进制字符,或者达到指定个数,都将停止读取
int get_bstr(char * st , int n)
{
char ch ;
int i = 0;
for (i = 0 ; i < n - 1 && (ch = getchar()) != '\n' && (isdigit(ch) || isspace(ch)) ; i++)
st[i] = ch ;
st[i] = '\0' ;
if (ch != '\n')
while (getchar() != '\n') ;
return i ;
}
//删除字符串中的空格
char * del_space(char * st)
{
int i = 0 ;
char * find = NULL ;
while (find = strchr(st , ' '))
{
for (i = 0 ; find[i] ; i++)
find[i] = find[i + 1] ;
}
return st ;
}
//核心函数,将二进制字符串转换为十进制
int btoi(char * st)
{
int number = 0 ;
for (int i = 0 ; st[i] ; i++)
{
number <<= 1 ;
number |= (st[i] - '0');
}
return number ;
}
no2.c
//编写一个程序,通过命令行参数读取两个二进制字符串,对这两个二进制数使用~运算符,&运算符,|运算符
//和^运算符,并以二进制字符串形式打印结果(如果无法使用命令行环境 , 可以通过交互式让程序读取字符串)
# include <stdio.h>
# include <limits.h>
# include <string.h>
# include <stdlib.h>
# include <ctype.h>
# define SIZE 33
int str_bstr(char * st);
char * del_space(char * st);
int btoi(char * st);
void print_bstr(unsigned int n);
//int main(int argc , char * argv[])
int main(void)
{
char argv[3][SIZE] = {"a.exe" , "a0101b" , "341010"};
int num1 , num2 ;
/*
if (argc != 3)
{
fputs("参数错误", stderr);
exit(1);
}
*/
str_bstr(argv[1]) ;
str_bstr(argv[2]) ;
num1 = btoi(del_space(argv[1]));
num2 = btoi(del_space(argv[2]));
printf("~%s == " ,argv[1]);
print_bstr(~num1);
putchar('\n');
printf("~%s == " ,argv[2]);
print_bstr(~num2);
putchar('\n');
printf("%s & %s == " , argv[1] , argv[2]);
print_bstr(num1 & num2);
putchar('\n');
printf("%s | %s == " , argv[1] , argv[2]);
print_bstr(num1 | num2);
putchar('\n');
printf("%s ^ %s == " , argv[1] , argv[2]);
print_bstr(num1 ^ num2);
putchar('\n');
return 0 ;
}
int str_bstr(char * st)
{
int cur = 0 ; //当前索引位置
char ch ;
for (int i = 0 ; st[i]; i++)
if((isdigit(st[i]) && st[i] < '2') || isspace(st[i]))
{
ch = st[cur] ;
st[cur] = st[i] ;
st[i] = ch ;
cur++ ;
}
st[cur] = '\0' ;
return cur ;
}
//删除字符串中的空格
char * del_space(char * st)
{
int i = 0 ;
char * find = NULL ;
while (find = strchr(st , ' '))
{
for (i = 0 ; find[i] ; i++)
find[i] = find[i + 1] ;
}
return st ;
}
//核心函数,将二进制字符串转换为十进制
int btoi(char * st)
{
int number = 0 ;
for (int i = 0 ; st[i] ; i++)
{
number <<= 1 ;
number |= (st[i] - '0');
}
return number ;
}
//使用递归方式使他反序打印字符
void print_bstr(unsigned int n)
{
static long loop = 0;
//如果形参是0,直接输出0,不进行递归
if (!loop && !n)
{
putchar('0');
return ;
}
if (n)
{
loop++ ;
print_bstr(n / 2) ;
}
else
return ;
putchar('0' + (n % 2));
if ((--loop % 4)== 0)
putchar(' ');
}
no3.c
//编写一个程序,接受一个int类型的参数,并返回该参数中打开位置的数量,在一个程序中测试该函数
# include <stdio.h>
int count_openbit(unsigned int n);
int main(void)
{
int num ;
puts("请输入您要查看打开位总数的整数:(q 退出)");
while (scanf(" %d" , &num))
{
while (getchar() != '\n') ;
printf("%d 中打开位一共有%d个\n" , num , count_openbit(num));
puts("请输入您要查看打开位总数的整数:(q 退出)");
}
return 0 ;
}
int count_openbit(unsigned int n)
{
int count = 0 ;
while (n)
{
count += (n & 1) ;
n >>= 1 ;
}