# include # define SIZE 33
void str_bstr(char * st);//函数在main下边需要申明一下
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]; //= {"strbin_test" , "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 ;
}
void str_bstr(char * str)//得到二进制的数,遇到>1的数和非数字停止输入
{
int n = 0 ; //当前索引位置
char ch ;
for (int i = 0 ; str[i]; i++)
if((isdigit(str[i]) && str[i] < '2') )
{
ch = str[n] ;
str[n] = str[i] ;
str[i] = ch ;
n++ ;
}
str[n] = '\0' ;//字符串后加结束符
}
//删除字符串中的空格
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)//第输出4个字符,打印一个空格
putchar(' ');
}